ul-data-gateway-sdk 0.4.5__tar.gz

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.
Files changed (155) hide show
  1. ul-data-gateway-sdk-0.4.5/PKG-INFO +276 -0
  2. ul-data-gateway-sdk-0.4.5/README.md +259 -0
  3. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/__init__.py +0 -0
  4. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/__tests__/__init__.py +0 -0
  5. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/__tests__/test_encryption.py +13 -0
  6. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/__init__.py +0 -0
  7. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/__tests__/__init__.py +0 -0
  8. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/__tests__/crypto_test.py +80 -0
  9. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/constants/__init__.py +0 -0
  10. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/constants/constants_aes.py +45 -0
  11. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/constants/constants_kuz.py +88 -0
  12. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/constants/kuz_tables.bin +0 -0
  13. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/crypto_aes.py +371 -0
  14. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/crypto_kuznechik.py +219 -0
  15. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/crypto_xtea.py +113 -0
  16. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/extensions/__init__.py +0 -0
  17. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/extensions/errors.py +19 -0
  18. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/extensions/type_alias.py +5 -0
  19. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/device_data.py +387 -0
  20. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/device_data_encryption.py +57 -0
  21. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/device_data_protocol.py +86 -0
  22. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/errors.py +19 -0
  23. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/messages/__init__.py +0 -0
  24. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/messages/input_bs_http_nero_message.py +7 -0
  25. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/nero_bs_protocol.py +37 -0
  26. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/__init__.py +0 -0
  27. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/__init__.py +0 -0
  28. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/__tests__/__init__.py +0 -0
  29. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/__tests__/test_device_protocol.py +1081 -0
  30. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/device_packet.py +55 -0
  31. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/ncp_smp_device_packet.py +57 -0
  32. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/smp_device_packet.py +63 -0
  33. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/smpm_device_packet.py +119 -0
  34. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/water5_device_packet.py +118 -0
  35. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/__init__.py +0 -0
  36. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/__tests__/__init__.py +0 -0
  37. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/__tests__/http_nero_bs_packet.py +282 -0
  38. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/__tests__/test_bs_protocol.py +258 -0
  39. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/http_nero_bs_packet.py +317 -0
  40. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/kafka_nero_bs_packet.py +143 -0
  41. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/nero_bs_packet.py +16 -0
  42. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__init__.py +0 -0
  43. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/__init__.py +0 -0
  44. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_3phase_consumed.py +107 -0
  45. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_3phase_generated.py +107 -0
  46. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_daily.py +106 -0
  47. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_info.py +34 -0
  48. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_journal.py +23 -0
  49. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h1_energy.py +35 -0
  50. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h2_energy.py +35 -0
  51. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h3_energy.py +35 -0
  52. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h_ar.py +34 -0
  53. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h_f.py +22 -0
  54. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h_pqs.py +34 -0
  55. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_tariff_consumed.py +107 -0
  56. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_tariff_generated.py +107 -0
  57. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_gaz_flow_08b_daily.py +32 -0
  58. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_gaz_flow_16b_daily.py +779 -0
  59. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_heat_proxy_meter_16b_daily.py +104 -0
  60. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_internal_info.py +11 -0
  61. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_08b_counter.py +20 -0
  62. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_08b_counter_ch1.py +32 -0
  63. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_08b_counter_ch2.py +32 -0
  64. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_12b_counter.py +56 -0
  65. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_16b_counter.py +394 -0
  66. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_04b_event.py +20 -0
  67. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_08b_daily.py +32 -0
  68. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_08b_info.py +20 -0
  69. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_12b_daily.py +394 -0
  70. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_16b_daily.py +778 -0
  71. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/test_self_package_tests.py +22 -0
  72. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_3phase_consumed.py +145 -0
  73. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_3phase_generated.py +141 -0
  74. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_daily.py +236 -0
  75. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_info.py +107 -0
  76. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_journal.py +453 -0
  77. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h1_energy.py +223 -0
  78. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h2_energy.py +222 -0
  79. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h3_energy.py +222 -0
  80. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h_ar.py +308 -0
  81. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h_f.py +281 -0
  82. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h_pqs.py +431 -0
  83. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_tariff_consumed.py +173 -0
  84. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_tariff_generated.py +172 -0
  85. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_gaz_flow_08b_daily.py +146 -0
  86. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_gaz_flow_16b_daily.py +253 -0
  87. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_heat_proxy_meter_16b_daily.py +143 -0
  88. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_internal_info.py +100 -0
  89. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_08b_counter.py +93 -0
  90. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_08b_counter_ch1.py +103 -0
  91. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_08b_counter_ch2.py +103 -0
  92. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_12b_counter.py +126 -0
  93. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_16b_counter.py +175 -0
  94. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_04b_event.py +117 -0
  95. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_08b_daily.py +172 -0
  96. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_08b_info.py +100 -0
  97. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_12b_daily.py +240 -0
  98. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_16b_daily.py +262 -0
  99. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/udp_wrapper/__init__.py +0 -0
  100. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/udp_wrapper/__tests__/__init__.py +0 -0
  101. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/udp_wrapper/__tests__/unbp_len.py +20 -0
  102. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/udp_wrapper/unbp_len.py +115 -0
  103. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__init__.py +0 -0
  104. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/__init__.py +0 -0
  105. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/test_self_package_tests.py +22 -0
  106. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_cold_reset.py +13 -0
  107. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_daily.py +13 -0
  108. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_info_ch1.py +13 -0
  109. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_info_ch2.py +13 -0
  110. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_magnet.py +9 -0
  111. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_fluo_a.py +39 -0
  112. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_fluo_freescale.py +72 -0
  113. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_fluo_stm.py +72 -0
  114. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_jupiter_freescale.py +72 -0
  115. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_jupiter_stm.py +40 -0
  116. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_metano_a.py +72 -0
  117. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch1.py +43 -0
  118. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch1_impulse.py +43 -0
  119. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch1_impulse_v2.py +44 -0
  120. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch2.py +43 -0
  121. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch2_impulse.py +43 -0
  122. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch2_impulse_v2.py +44 -0
  123. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_cold_reset.py +64 -0
  124. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_daily.py +63 -0
  125. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_info_ch1.py +64 -0
  126. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_info_ch2.py +65 -0
  127. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_magnet.py +47 -0
  128. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_fluo_a.py +88 -0
  129. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_fluo_freescale.py +97 -0
  130. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_fluo_stm.py +93 -0
  131. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_jupiter_freescale.py +89 -0
  132. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_jupiter_stm.py +86 -0
  133. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_metano_a.py +97 -0
  134. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch1.py +83 -0
  135. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch1_impulse.py +84 -0
  136. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch1_impulse_v2.py +85 -0
  137. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch2.py +83 -0
  138. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch2_impulse.py +85 -0
  139. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch2_impulse_v2.py +84 -0
  140. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/py.typed +0 -0
  141. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/__init__.py +0 -0
  142. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/__tests__/__init__.py +0 -0
  143. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/__tests__/timestamp_calculation.py +36 -0
  144. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/buf_ref.py +48 -0
  145. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/days_ago_calculation.py +11 -0
  146. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/packet.py +42 -0
  147. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/timestamp_calculation.py +31 -0
  148. ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/true_round.py +2 -0
  149. ul-data-gateway-sdk-0.4.5/setup.cfg +4 -0
  150. ul-data-gateway-sdk-0.4.5/setup.py +41 -0
  151. ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/PKG-INFO +276 -0
  152. ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/SOURCES.txt +153 -0
  153. ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/dependency_links.txt +1 -0
  154. ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/requires.txt +4 -0
  155. ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/top_level.txt +1 -0
@@ -0,0 +1,276 @@
1
+ Metadata-Version: 2.1
2
+ Name: ul-data-gateway-sdk
3
+ Version: 0.4.5
4
+ Summary: Data gateway sdk
5
+ Author: Unic-lab
6
+ License: MIT
7
+ Platform: any
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Programming Language :: Python
11
+ Classifier: Programming Language :: Python :: 3.6
12
+ Classifier: Programming Language :: Python :: 3.7
13
+ Classifier: Programming Language :: Python :: 3.8
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Operating System :: OS Independent
16
+ Description-Content-Type: text/markdown
17
+
18
+ # Data adapter
19
+ Входной слой поступления данных от приборов или других источников
20
+
21
+ Примерный флоу данных от прибора такой:
22
+ - данные поступают от прибора в балансирощик данных
23
+ - попадают в сервис юдп
24
+ - сервис юдп отправляет пакет в очередь в виде сообщения, оформляя сообщение в нужную структуру, выдавая идентификатор конкретному запросу
25
+ - воркер разбора конкретного протокола разбирает пакет
26
+ - воркер рассылает в распределитель сообщение уже с распаршенными данными, если они валидны, так же отправляет его же в сбор метаданных
27
+ - воркер метаданных сохраняет логи по конкретному прибору
28
+ - воркер распределителя отправляет сообщение в нужную интеграцию
29
+ - воркер интеграции конкретного провайдера читает из очереди и отправляет в нужный сервис
30
+
31
+ ____
32
+
33
+ ## Сервисы
34
+
35
+ Сервис это библиотека, сервис это то что в рантайме всегда
36
+
37
+ ### data_gateway__broker__amqp
38
+ сервис брокера очередей сообщений
39
+
40
+ ### data_gateway__device_smp__udp_server
41
+ сервис приложения, написанный на GO. слушает порт UDP и отправляет в очередь на разбор пакета. Технически ему не важен протокол. Ожидает сообщения из очереди с айди сообщения запроса. так же слушает очередь прибора для отправки к конкретному прибору
42
+
43
+ ### data_gateway__balancer
44
+ Балансировщик нагрузки.
45
+
46
+ ВСЕ ВНЕШНИЕ ПОРТЫ ДОЛЖНЫ ПРОБРАСЫВАТЬСЯ ЧЕРЕЗ НЕГО
47
+
48
+ ### mon_*
49
+ `mon__metrics__aggregator`, `mon__metrics__dashboard`, `mon__process_explorer__server`, `mon__process_explorer__container`, `mon__log__aggregator`
50
+
51
+ сервисы сбора аналитических данных
52
+
53
+
54
+ ____
55
+
56
+ ## Переменные среды для деплоя
57
+ `DD_API_KEY` - api ключ datadog
58
+
59
+ `DH_PARAM` - для шифрования в nginx
60
+
61
+ `SSH_ID_RSA` - приватный ключ доступа на сервер для развертывания
62
+
63
+ `{CI_BRANCH}_DATABASE_ENDPOINT` - эндпоинт для коннекта к базе данных. Содержит в себе юзернейм, пароль и название самой базы данных
64
+ `{CI_BRANCH}_APPLICATION_BROKER_ENDPOINT` - эндпоинт для коннекта к броокеру сообщений (rabbitmq). Содержит в себе юзернейм и пароль
65
+
66
+ ## Глобальные зависимости
67
+ - ubuntu 20.04
68
+ - bash
69
+ - make
70
+ - python `3.8.6`
71
+ - pyenv
72
+ - pipenv
73
+ - docker-compose `1.27.4`
74
+ - docker `19.03.13`
75
+
76
+ ## Команды
77
+
78
+ ### обновление репозитория до последнего состояния в ветке
79
+ ```bash
80
+ make cleanup
81
+ ```
82
+ Это обновит пакеты и почистит все необходимое
83
+
84
+ ### Запуск локально
85
+ ```bash
86
+ make up
87
+ ```
88
+ Запустит все необходимые контейнеры
89
+
90
+ ### Тестовая нагрузка на сервисы
91
+
92
+ нагрузит воркер СМП одним тестовым сообщением. добавит его в очередь
93
+ ```bash
94
+ make worker_SMP_load
95
+ ```
96
+
97
+ нагрузит воркер СМП одним реальным сообщением от прибора. добавит его в очередь
98
+ ```bash
99
+ make worker_SMP_load_real_raw_data
100
+ ```
101
+
102
+ нагрузит воркер распределителя интеграции
103
+ ```bash
104
+ make integration_router_load
105
+ ```
106
+
107
+ ```bash
108
+ make load_UDP_SMP_getset
109
+ ```
110
+
111
+ ```bash
112
+ make DEV_load_UDP_SMP_getset
113
+ ```
114
+ ### Системные команды
115
+ ```bash
116
+ make update-ci-images
117
+ ```
118
+
119
+ ### Работа с Grafana
120
+
121
+ В данный момент графана крутится на 4011 порту, т.е. дабы получить туда доступ, то небходимо, например, перейти по адресу 192.168.10.92:4011
122
+
123
+ Рабочих дашборда 2 - Docker and system monitoring && RabbitMQ-Overview
124
+ #### Docker and system monitoring
125
+ На данном дашборде указаныф все метрики по серверу и контейнерам, кол-во свободного дискового пространства, ЦПУ. RAM, SWAP и т.д. как для сервера, так и для контейнера
126
+ Алерты приходяи при превышении пороговых значений по ЦПУ, RAM, Disc Space, а также если кол-во контейнеров падает ниже 14 (необходима ручная подстройка, если в какой-то момент добавятся ещё сервисы)
127
+
128
+ #### RabbitMQ-Overview
129
+ Дублирует админку RabbitMQ с точки зрения сбора показателей
130
+
131
+ # KAFKA
132
+ Если речь идёт о наших сертификатах - всё описано в файле kafka_ssl_startup.sh и kafka_generate_client_ssl.sh
133
+ Это создание сертификатов как серверных, так и клиентскихз с использованием нашего CA севрера
134
+
135
+
136
+ Следующий блок посвящён генерации SSL ключей для kafka. Основным источником информации послужили [туториал один](https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/KafkaIntegrationGuide/TLS-SSL/KafkaTLS-SSLExamplePart1CreateRootCA.htm?TocPath=Integrating%20with%20Apache%20Kafka|Using%20TLS%2FSSL%20Encryption%20with%20Kafka|_____5 "Тык один") и [туториал два](https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/KafkaIntegrationGuide/TLS-SSL/KafkaTLS-SSLExamplePart3ConfigureKafka.htm?tocpath=Integrating%20with%20Apache%20Kafka%7CUsing%20TLS%2FSSL%20Encryption%20with%20Kafka%7C_____7 "Тык два")
137
+ А также личный опыт
138
+
139
+ Для генерации калючей, необходимы `keytool` и `openssl`
140
+ Первым шагом - необходимо сгенерировать CA ключ (приватный)
141
+ ```bash
142
+ openssl genrsa -out root.key
143
+ ```
144
+ и самим же его подписать
145
+ ```bash
146
+ openssl req -new -x509 -key root.key -out root.crt
147
+ ```
148
+ и для безопасности
149
+ ```bash
150
+ chmod 600 root.key
151
+ chmod 644 root.crt
152
+ ```
153
+ Запомним эти два ключа, они нам ещё пригодятся
154
+
155
+ ---
156
+
157
+ Для простоты использования и копирования, в дальнейшщих командах используется переменная `DOMAIN`, в которой лежит URL, на котором будет в будущем торчать KAFKA
158
+
159
+ Создаём хранилище сертификатов. Оно одно для всех брокеров Kafka. В нашем случае, там должен лежать только CA сертификат
160
+ ```bash
161
+ keytool -keystore kafka.truststore.jks -alias CARoot -import -file root.crt
162
+ ```
163
+ >Use the fully-qualified domain name (FQDN)
164
+
165
+ Создаём хранилище ключей для брокера, их может быть много, так что длоя каждого брокера оно должно быть своё
166
+ На вопрос
167
+ >What is your first and last name?
168
+
169
+ Отвечаем DNS именем
170
+ ```bash
171
+ keytool -keystore kafka01.keystore.jks -alias $DOMAIN -validity 365 -genkey -keyalg RSA -ext SAN=DNS:$DOMAIN
172
+ ```
173
+
174
+ Достаём из хранилища сертификат брокера...
175
+ ```bash
176
+ keytool -keystore kafka01.keystore.jks -alias $DOMAIN -certreq -file kafka01.unsigned.crt
177
+ ```
178
+ ...подписываем его нашим CA сертификатом...
179
+ ```bash
180
+ openssl x509 -req -CA root.crt -CAkey root.key -in kafka01.unsigned.crt -out kafka01.signed.crt -days 365 -CAcreateserial
181
+ ```
182
+ ...и кладём сертификат брокера обратно в его хранилище, вместе с CA сертификатом
183
+ ```bash
184
+ keytool -keystore kafka01.keystore.jks -alias CARoot -import -file root.crt
185
+ keytool -keystore kafka01.keystore.jks -alias $DOMAIN -import -file kafka01.signed.crt
186
+ ```
187
+
188
+ В сухом остатке, для корректной работы SSL, нам нобходимы только пароли, а также truestore & keystore(s)
189
+
190
+ ---
191
+
192
+ И генерация Ключей для клиента. Надеюсь, вы ещё не потеряли ваши CA ключи, они вам сейчас понадобятся
193
+ Начинаем генерацию клиентского интерфейса с генерации RSA 2048 ключа в паре с сертификатом (Всё это добро сразу кладётся в хранилище)
194
+
195
+ ```bash
196
+ keytool -keystore kafka.keystore.jks -alias localhost -genkeypair -keyalg rsa
197
+ ```
198
+ Достаём неподписаный ключ из хранилища и полдписываем его CA сертифифкатом
199
+ ```bash
200
+ keytool -keystore kafka.keystore.jks -alias localhost -certreq -file cert-req-file
201
+ openssl x509 -req -CA root.crt -CAkey root.key -in cert-req-file -out certificate.pem -days 365 -CAcreateserial
202
+ ```
203
+
204
+ Для авторизации по SSL вам, как клиенту, понадобится ещё и приватник, так что и его достаём из хранилища
205
+ ```bash
206
+ keytool -importkeystore -srckeystore kafka.keystore.jks -srcalias localhost -destalias notebook -destkeystore client.p12 -deststoretype PKCS12
207
+ openssl pkcs12 -in client.p12 -nodes -nocerts -out ca-key
208
+ ```
209
+
210
+
211
+
212
+ ### Именование сервисов
213
+ `%prefix%__%pod_name%__%pod_service_name%`
214
+
215
+ * %**prefix**%
216
+ * mon - мониторинг, вспомогательный сервис
217
+ * service - приложение, которое работает автономно, обрабатывает запросы или работает в фоне
218
+ * manager - приложение, которое запускается только ради команды, затем гаснет
219
+ * %**pod_name**%
220
+ * data_logger
221
+ * integration
222
+ * integration_*
223
+ * mts
224
+ * device_*
225
+ * ncp_smp
226
+ * smp
227
+ * water5
228
+ * communication
229
+ * %**pod_service_name**%
230
+ * *_%semantic_name%_worker
231
+ * push
232
+ * pull
233
+ * chrono
234
+ * *_%transport_protocol%_server
235
+ * *_%semantic_name%_db
236
+ * state
237
+ * cache
238
+ * common
239
+ * *_api
240
+ * *_web
241
+ * *_app
242
+ * broker
243
+
244
+
245
+ ### Работа с Kubernetes
246
+
247
+ Т.к. удалённо все наши сервисы уже работают в кубере, надол уметь с ним работать. Минимально я вам уже рассказал про то, как оно изнутри
248
+ рабоатет и как писать конфиги, то сейчас о полезных командах
249
+
250
+ Выдаёт список подов/сервисов/секретов/деплойментов одного неймспейса:
251
+ ```bash
252
+ kubectl get pods/svc/secrets/deployments
253
+ ```
254
+ В любую команду, связанную с сервисами, деплойментами. подами или секретами можно докинуть ключ `-A` или `--all-namespaces` для получения списка подов со всех неймспейсов
255
+ или `-n <namespace>` `--namespace=<namespace>` для пролучения списка подов с конкретного неймспейса
256
+ Выдаёт список нейсмспейсов
257
+ ```bash
258
+ kubectl get namespaces
259
+ ```
260
+
261
+ ВЫдаёт конфиг конкретного пода (перемнные проброшенные, контейнера и их порты)
262
+ ```bash
263
+ kubectl describe pod <pod_name>
264
+ ```
265
+ Меняет рабочий неймспейс на тот, что вы уукажите
266
+ ```bash
267
+ kubectl config set-context --current --namespace=<namespace>
268
+ ```
269
+ Заходим внутрь пода
270
+ ```bash
271
+ kubectl exec -it <pod_name> -- /bin/bash
272
+ ```
273
+ Получение логов пода
274
+ ```bash
275
+ kubectl logs <pod_name>
276
+ ```
@@ -0,0 +1,259 @@
1
+ # Data adapter
2
+ Входной слой поступления данных от приборов или других источников
3
+
4
+ Примерный флоу данных от прибора такой:
5
+ - данные поступают от прибора в балансирощик данных
6
+ - попадают в сервис юдп
7
+ - сервис юдп отправляет пакет в очередь в виде сообщения, оформляя сообщение в нужную структуру, выдавая идентификатор конкретному запросу
8
+ - воркер разбора конкретного протокола разбирает пакет
9
+ - воркер рассылает в распределитель сообщение уже с распаршенными данными, если они валидны, так же отправляет его же в сбор метаданных
10
+ - воркер метаданных сохраняет логи по конкретному прибору
11
+ - воркер распределителя отправляет сообщение в нужную интеграцию
12
+ - воркер интеграции конкретного провайдера читает из очереди и отправляет в нужный сервис
13
+
14
+ ____
15
+
16
+ ## Сервисы
17
+
18
+ Сервис это библиотека, сервис это то что в рантайме всегда
19
+
20
+ ### data_gateway__broker__amqp
21
+ сервис брокера очередей сообщений
22
+
23
+ ### data_gateway__device_smp__udp_server
24
+ сервис приложения, написанный на GO. слушает порт UDP и отправляет в очередь на разбор пакета. Технически ему не важен протокол. Ожидает сообщения из очереди с айди сообщения запроса. так же слушает очередь прибора для отправки к конкретному прибору
25
+
26
+ ### data_gateway__balancer
27
+ Балансировщик нагрузки.
28
+
29
+ ВСЕ ВНЕШНИЕ ПОРТЫ ДОЛЖНЫ ПРОБРАСЫВАТЬСЯ ЧЕРЕЗ НЕГО
30
+
31
+ ### mon_*
32
+ `mon__metrics__aggregator`, `mon__metrics__dashboard`, `mon__process_explorer__server`, `mon__process_explorer__container`, `mon__log__aggregator`
33
+
34
+ сервисы сбора аналитических данных
35
+
36
+
37
+ ____
38
+
39
+ ## Переменные среды для деплоя
40
+ `DD_API_KEY` - api ключ datadog
41
+
42
+ `DH_PARAM` - для шифрования в nginx
43
+
44
+ `SSH_ID_RSA` - приватный ключ доступа на сервер для развертывания
45
+
46
+ `{CI_BRANCH}_DATABASE_ENDPOINT` - эндпоинт для коннекта к базе данных. Содержит в себе юзернейм, пароль и название самой базы данных
47
+ `{CI_BRANCH}_APPLICATION_BROKER_ENDPOINT` - эндпоинт для коннекта к броокеру сообщений (rabbitmq). Содержит в себе юзернейм и пароль
48
+
49
+ ## Глобальные зависимости
50
+ - ubuntu 20.04
51
+ - bash
52
+ - make
53
+ - python `3.8.6`
54
+ - pyenv
55
+ - pipenv
56
+ - docker-compose `1.27.4`
57
+ - docker `19.03.13`
58
+
59
+ ## Команды
60
+
61
+ ### обновление репозитория до последнего состояния в ветке
62
+ ```bash
63
+ make cleanup
64
+ ```
65
+ Это обновит пакеты и почистит все необходимое
66
+
67
+ ### Запуск локально
68
+ ```bash
69
+ make up
70
+ ```
71
+ Запустит все необходимые контейнеры
72
+
73
+ ### Тестовая нагрузка на сервисы
74
+
75
+ нагрузит воркер СМП одним тестовым сообщением. добавит его в очередь
76
+ ```bash
77
+ make worker_SMP_load
78
+ ```
79
+
80
+ нагрузит воркер СМП одним реальным сообщением от прибора. добавит его в очередь
81
+ ```bash
82
+ make worker_SMP_load_real_raw_data
83
+ ```
84
+
85
+ нагрузит воркер распределителя интеграции
86
+ ```bash
87
+ make integration_router_load
88
+ ```
89
+
90
+ ```bash
91
+ make load_UDP_SMP_getset
92
+ ```
93
+
94
+ ```bash
95
+ make DEV_load_UDP_SMP_getset
96
+ ```
97
+ ### Системные команды
98
+ ```bash
99
+ make update-ci-images
100
+ ```
101
+
102
+ ### Работа с Grafana
103
+
104
+ В данный момент графана крутится на 4011 порту, т.е. дабы получить туда доступ, то небходимо, например, перейти по адресу 192.168.10.92:4011
105
+
106
+ Рабочих дашборда 2 - Docker and system monitoring && RabbitMQ-Overview
107
+ #### Docker and system monitoring
108
+ На данном дашборде указаныф все метрики по серверу и контейнерам, кол-во свободного дискового пространства, ЦПУ. RAM, SWAP и т.д. как для сервера, так и для контейнера
109
+ Алерты приходяи при превышении пороговых значений по ЦПУ, RAM, Disc Space, а также если кол-во контейнеров падает ниже 14 (необходима ручная подстройка, если в какой-то момент добавятся ещё сервисы)
110
+
111
+ #### RabbitMQ-Overview
112
+ Дублирует админку RabbitMQ с точки зрения сбора показателей
113
+
114
+ # KAFKA
115
+ Если речь идёт о наших сертификатах - всё описано в файле kafka_ssl_startup.sh и kafka_generate_client_ssl.sh
116
+ Это создание сертификатов как серверных, так и клиентскихз с использованием нашего CA севрера
117
+
118
+
119
+ Следующий блок посвящён генерации SSL ключей для kafka. Основным источником информации послужили [туториал один](https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/KafkaIntegrationGuide/TLS-SSL/KafkaTLS-SSLExamplePart1CreateRootCA.htm?TocPath=Integrating%20with%20Apache%20Kafka|Using%20TLS%2FSSL%20Encryption%20with%20Kafka|_____5 "Тык один") и [туториал два](https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/KafkaIntegrationGuide/TLS-SSL/KafkaTLS-SSLExamplePart3ConfigureKafka.htm?tocpath=Integrating%20with%20Apache%20Kafka%7CUsing%20TLS%2FSSL%20Encryption%20with%20Kafka%7C_____7 "Тык два")
120
+ А также личный опыт
121
+
122
+ Для генерации калючей, необходимы `keytool` и `openssl`
123
+ Первым шагом - необходимо сгенерировать CA ключ (приватный)
124
+ ```bash
125
+ openssl genrsa -out root.key
126
+ ```
127
+ и самим же его подписать
128
+ ```bash
129
+ openssl req -new -x509 -key root.key -out root.crt
130
+ ```
131
+ и для безопасности
132
+ ```bash
133
+ chmod 600 root.key
134
+ chmod 644 root.crt
135
+ ```
136
+ Запомним эти два ключа, они нам ещё пригодятся
137
+
138
+ ---
139
+
140
+ Для простоты использования и копирования, в дальнейшщих командах используется переменная `DOMAIN`, в которой лежит URL, на котором будет в будущем торчать KAFKA
141
+
142
+ Создаём хранилище сертификатов. Оно одно для всех брокеров Kafka. В нашем случае, там должен лежать только CA сертификат
143
+ ```bash
144
+ keytool -keystore kafka.truststore.jks -alias CARoot -import -file root.crt
145
+ ```
146
+ >Use the fully-qualified domain name (FQDN)
147
+
148
+ Создаём хранилище ключей для брокера, их может быть много, так что длоя каждого брокера оно должно быть своё
149
+ На вопрос
150
+ >What is your first and last name?
151
+
152
+ Отвечаем DNS именем
153
+ ```bash
154
+ keytool -keystore kafka01.keystore.jks -alias $DOMAIN -validity 365 -genkey -keyalg RSA -ext SAN=DNS:$DOMAIN
155
+ ```
156
+
157
+ Достаём из хранилища сертификат брокера...
158
+ ```bash
159
+ keytool -keystore kafka01.keystore.jks -alias $DOMAIN -certreq -file kafka01.unsigned.crt
160
+ ```
161
+ ...подписываем его нашим CA сертификатом...
162
+ ```bash
163
+ openssl x509 -req -CA root.crt -CAkey root.key -in kafka01.unsigned.crt -out kafka01.signed.crt -days 365 -CAcreateserial
164
+ ```
165
+ ...и кладём сертификат брокера обратно в его хранилище, вместе с CA сертификатом
166
+ ```bash
167
+ keytool -keystore kafka01.keystore.jks -alias CARoot -import -file root.crt
168
+ keytool -keystore kafka01.keystore.jks -alias $DOMAIN -import -file kafka01.signed.crt
169
+ ```
170
+
171
+ В сухом остатке, для корректной работы SSL, нам нобходимы только пароли, а также truestore & keystore(s)
172
+
173
+ ---
174
+
175
+ И генерация Ключей для клиента. Надеюсь, вы ещё не потеряли ваши CA ключи, они вам сейчас понадобятся
176
+ Начинаем генерацию клиентского интерфейса с генерации RSA 2048 ключа в паре с сертификатом (Всё это добро сразу кладётся в хранилище)
177
+
178
+ ```bash
179
+ keytool -keystore kafka.keystore.jks -alias localhost -genkeypair -keyalg rsa
180
+ ```
181
+ Достаём неподписаный ключ из хранилища и полдписываем его CA сертифифкатом
182
+ ```bash
183
+ keytool -keystore kafka.keystore.jks -alias localhost -certreq -file cert-req-file
184
+ openssl x509 -req -CA root.crt -CAkey root.key -in cert-req-file -out certificate.pem -days 365 -CAcreateserial
185
+ ```
186
+
187
+ Для авторизации по SSL вам, как клиенту, понадобится ещё и приватник, так что и его достаём из хранилища
188
+ ```bash
189
+ keytool -importkeystore -srckeystore kafka.keystore.jks -srcalias localhost -destalias notebook -destkeystore client.p12 -deststoretype PKCS12
190
+ openssl pkcs12 -in client.p12 -nodes -nocerts -out ca-key
191
+ ```
192
+
193
+
194
+
195
+ ### Именование сервисов
196
+ `%prefix%__%pod_name%__%pod_service_name%`
197
+
198
+ * %**prefix**%
199
+ * mon - мониторинг, вспомогательный сервис
200
+ * service - приложение, которое работает автономно, обрабатывает запросы или работает в фоне
201
+ * manager - приложение, которое запускается только ради команды, затем гаснет
202
+ * %**pod_name**%
203
+ * data_logger
204
+ * integration
205
+ * integration_*
206
+ * mts
207
+ * device_*
208
+ * ncp_smp
209
+ * smp
210
+ * water5
211
+ * communication
212
+ * %**pod_service_name**%
213
+ * *_%semantic_name%_worker
214
+ * push
215
+ * pull
216
+ * chrono
217
+ * *_%transport_protocol%_server
218
+ * *_%semantic_name%_db
219
+ * state
220
+ * cache
221
+ * common
222
+ * *_api
223
+ * *_web
224
+ * *_app
225
+ * broker
226
+
227
+
228
+ ### Работа с Kubernetes
229
+
230
+ Т.к. удалённо все наши сервисы уже работают в кубере, надол уметь с ним работать. Минимально я вам уже рассказал про то, как оно изнутри
231
+ рабоатет и как писать конфиги, то сейчас о полезных командах
232
+
233
+ Выдаёт список подов/сервисов/секретов/деплойментов одного неймспейса:
234
+ ```bash
235
+ kubectl get pods/svc/secrets/deployments
236
+ ```
237
+ В любую команду, связанную с сервисами, деплойментами. подами или секретами можно докинуть ключ `-A` или `--all-namespaces` для получения списка подов со всех неймспейсов
238
+ или `-n <namespace>` `--namespace=<namespace>` для пролучения списка подов с конкретного неймспейса
239
+ Выдаёт список нейсмспейсов
240
+ ```bash
241
+ kubectl get namespaces
242
+ ```
243
+
244
+ ВЫдаёт конфиг конкретного пода (перемнные проброшенные, контейнера и их порты)
245
+ ```bash
246
+ kubectl describe pod <pod_name>
247
+ ```
248
+ Меняет рабочий неймспейс на тот, что вы уукажите
249
+ ```bash
250
+ kubectl config set-context --current --namespace=<namespace>
251
+ ```
252
+ Заходим внутрь пода
253
+ ```bash
254
+ kubectl exec -it <pod_name> -- /bin/bash
255
+ ```
256
+ Получение логов пода
257
+ ```bash
258
+ kubectl logs <pod_name>
259
+ ```
File without changes
@@ -0,0 +1,13 @@
1
+ from data_gateway_sdk.device_data_encryption import EncryptionType
2
+
3
+
4
+ def test_decrypt_xtea_v_nero_v0() -> None:
5
+ assert EncryptionType.XTEA_V_NERO_V0.decrypt(bytes.fromhex('8725024c66319b82'), bytes.fromhex('19208f5fd151c0b7e7c7890610f994b5c4fe697620b67e509b0ea2bd942b1fd6')) == bytes.fromhex('73086e0a000000a5') # noqa: W391
6
+ assert EncryptionType.XTEA_V_NERO_V0.decrypt(bytes.fromhex('461dee8050910076'), bytes.fromhex('6b4095ae9e35c7f4cbbd31de33a023e3f2d01d7c6041a885a13d202643118812')) == bytes.fromhex('7b3a00000000001f') # noqa: W391
7
+ assert EncryptionType.XTEA_V_NERO_V0.decrypt(bytes.fromhex('1ff19c361fd435cb'), bytes.fromhex('21dfdaae138b13c4c40fa2a560e51cbeca849f5b0d5b02232c27559125ddb124')) == bytes.fromhex('54c2000000000000') # noqa: W391
8
+
9
+
10
+ def test_encrypt_xtea_v_nero_v0() -> None:
11
+ assert EncryptionType.XTEA_V_NERO_V0.encrypt(bytes.fromhex('73086e0a000000a5'), bytes.fromhex('19208f5fd151c0b7e7c7890610f994b5c4fe697620b67e509b0ea2bd942b1fd6')) == bytes.fromhex('8725024c66319b82') # noqa: W391
12
+ assert EncryptionType.XTEA_V_NERO_V0.encrypt(bytes.fromhex('7b3a00000000001f'), bytes.fromhex('6b4095ae9e35c7f4cbbd31de33a023e3f2d01d7c6041a885a13d202643118812')) == bytes.fromhex('461dee8050910076') # noqa: W391
13
+ assert EncryptionType.XTEA_V_NERO_V0.encrypt(bytes.fromhex('54c2000000000000'), bytes.fromhex('21dfdaae138b13c4c40fa2a560e51cbeca849f5b0d5b02232c27559125ddb124')) == bytes.fromhex('1ff19c361fd435cb') # noqa: W391
@@ -0,0 +1,80 @@
1
+ import unittest
2
+
3
+ from data_gateway_sdk.crypto_algorithms.crypto_aes import aes_ecb_decryption, aes_ecb_encryption, AesError
4
+ from data_gateway_sdk.crypto_algorithms.crypto_kuznechik import kuznechik_encryption, kuznechik_decryption, KuznechikError
5
+
6
+
7
+ class TestCrypto(unittest.TestCase):
8
+ def test_aes_128(self) -> None:
9
+ # ECB-AES-128 test
10
+ plaintext = bytes.fromhex('6bc1bee22e409f96e93d7e117393172a'
11
+ 'ae2d8a571e03ac9c9eb76fac45af8e51'
12
+ '30c81c46a35ce411e5fbc1191a0a52ef'
13
+ 'f69f2445df4f9b17ad2b417be66c3710')
14
+
15
+ key = bytes.fromhex('2b7e151628aed2a6abf7158809cf4f3c')
16
+
17
+ expected_ciphertext = bytes.fromhex('3ad77bb40d7a3660a89ecaf32466ef97'
18
+ 'f5d3d58503b9699de785895a96fdbaaf'
19
+ '43b1cd7f598ece23881b00e3ed030688'
20
+ '7b0c785e27e8ad3f8223207104725dd4')
21
+
22
+ ciphertext = aes_ecb_encryption(plaintext, key)
23
+ self.assertEqual(ciphertext, expected_ciphertext)
24
+
25
+ recovered_plaintext = aes_ecb_decryption(ciphertext, key)
26
+ self.assertEqual(recovered_plaintext, plaintext)
27
+
28
+ def test_aes_256(self) -> None:
29
+ # ECB-AES-256 test
30
+ plaintext = bytes.fromhex('00112233445566778899aabbccddeeff'
31
+ '00112233445566778899aabbccddeeff'
32
+ '00112233445566778899aabbccddeeff'
33
+ '00112233445566778899aabbccddeeff')
34
+
35
+ key = bytes.fromhex('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f')
36
+
37
+ expected_ciphertext = bytes.fromhex('8ea2b7ca516745bfeafc49904b496089'
38
+ '8ea2b7ca516745bfeafc49904b496089'
39
+ '8ea2b7ca516745bfeafc49904b496089'
40
+ '8ea2b7ca516745bfeafc49904b496089')
41
+
42
+ ciphertext = aes_ecb_encryption(plaintext, key)
43
+ self.assertEqual(ciphertext, expected_ciphertext)
44
+
45
+ recovered_plaintext = aes_ecb_decryption(ciphertext, key)
46
+ self.assertEqual(recovered_plaintext, plaintext)
47
+
48
+ with self.assertRaises(AesError):
49
+ plaintext = bytes.fromhex('00112233445566778899aabbccddeeff'
50
+ '00112233445566778899aabbccddeeff'
51
+ '00112233445566778899aabbccddeeff'
52
+ '00112233445566778899aabbccddeeff')
53
+ key = bytes.fromhex('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e')
54
+ aes_ecb_encryption(plaintext, key)
55
+
56
+ def test_kuznechik(self) -> None:
57
+ mtest = bytes.fromhex('1122334455667700ffeeddccbbaa9988')
58
+ ktest = bytes.fromhex('8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef')
59
+
60
+ encrypted_block = kuznechik_encryption(mtest, ktest)
61
+ expected_enc = bytes.fromhex('7f679d90bebc24305a468d42b9d4edcd')
62
+ self.assertEqual(encrypted_block, expected_enc)
63
+
64
+ decrypted_block = kuznechik_decryption(encrypted_block, ktest)
65
+ expected_dec = bytes.fromhex('1122334455667700ffeeddccbbaa9988')
66
+ self.assertEqual(decrypted_block, expected_dec)
67
+
68
+ with self.assertRaises(KuznechikError):
69
+ mtest = bytes.fromhex('1122334455667700ffeeddccbbaa9988')
70
+ ktest = bytes.fromhex('8899aabbccddeeff0011223344556677fedcba98765432100123456789abcd')
71
+ kuznechik_encryption(mtest, ktest)
72
+
73
+ with self.assertRaises(KuznechikError):
74
+ mtest = bytes.fromhex('1122334455667700ffeeddccbbaa99')
75
+ ktest = bytes.fromhex('8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef')
76
+ kuznechik_encryption(mtest, ktest)
77
+
78
+
79
+ if __name__ == "__main__":
80
+ unittest.main()