flwr-nightly 1.9.0.dev20240523__tar.gz → 1.9.0.dev20240527__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

Files changed (231) hide show
  1. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/PKG-INFO +2 -3
  2. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/pyproject.toml +3 -4
  3. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/supernode/app.py +41 -23
  4. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/recordset_compat.py +8 -1
  5. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -15
  6. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/app.py +66 -112
  7. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/LICENSE +0 -0
  8. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/README.md +0 -0
  9. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/__init__.py +0 -0
  10. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/__init__.py +0 -0
  11. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/app.py +0 -0
  12. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/build.py +0 -0
  13. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/config_utils.py +0 -0
  14. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/example.py +0 -0
  15. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/__init__.py +0 -0
  16. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/new.py +0 -0
  17. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  18. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  19. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  20. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  21. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  22. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  23. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
  24. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  25. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  26. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  27. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  28. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  29. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  30. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
  31. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  32. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  33. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  34. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  35. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  36. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  37. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
  38. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  39. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  40. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  41. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  42. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +0 -0
  43. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  44. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  45. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  46. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  47. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  48. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  49. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/run/__init__.py +0 -0
  50. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/run/run.py +0 -0
  51. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/cli/utils.py +0 -0
  52. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/__init__.py +0 -0
  53. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/app.py +0 -0
  54. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/client.py +0 -0
  55. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/client_app.py +0 -0
  56. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  57. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/grpc_client/connection.py +0 -0
  59. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  60. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  61. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  62. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/heartbeat.py +0 -0
  63. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/message_handler/__init__.py +0 -0
  64. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  65. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  66. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/mod/__init__.py +0 -0
  67. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  68. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/mod/comms_mods.py +0 -0
  69. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  70. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  71. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  72. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  73. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/mod/utils.py +0 -0
  74. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/node_state.py +0 -0
  75. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/node_state_tests.py +0 -0
  76. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/numpy_client.py +0 -0
  77. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/rest_client/__init__.py +0 -0
  78. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/rest_client/connection.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/supernode/__init__.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/client/typing.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/__init__.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/address.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/constant.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/context.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/date.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/differential_privacy.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/dp.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/exit_handlers.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/grpc.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/logger.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/message.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/object_ref.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/parameter.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/pyproject.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/record/__init__.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/record/configsrecord.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/record/conversion_utils.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/record/metricsrecord.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/record/parametersrecord.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/record/recordset.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/record/typeddict.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/retry_invoker.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  109. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  111. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/serde.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/telemetry.py +0 -0
  113. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/typing.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/common/version.py +0 -0
  115. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/__init__.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/driver_pb2.py +0 -0
  117. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  118. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  119. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  120. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/error_pb2.py +0 -0
  121. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/error_pb2.pyi +0 -0
  122. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  123. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  124. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/fleet_pb2.py +0 -0
  125. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  126. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  127. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  128. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/node_pb2.py +0 -0
  129. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/node_pb2.pyi +0 -0
  130. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  131. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  132. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/recordset_pb2.py +0 -0
  133. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  134. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  135. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  136. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/task_pb2.py +0 -0
  137. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/task_pb2.pyi +0 -0
  138. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  139. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  140. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/transport_pb2.py +0 -0
  141. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  142. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  143. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  144. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/py.typed +0 -0
  145. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/__init__.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/client_manager.py +0 -0
  147. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/client_proxy.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/compat/__init__.py +0 -0
  149. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/compat/app.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/compat/app_utils.py +0 -0
  151. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/compat/legacy_context.py +0 -0
  153. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/criterion.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/driver/__init__.py +0 -0
  155. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/driver/driver.py +0 -0
  156. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  157. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/history.py +0 -0
  159. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/run_serverapp.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/server.py +0 -0
  161. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/server_app.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/server_config.py +0 -0
  163. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/__init__.py +0 -0
  164. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/aggregate.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/bulyan.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedadam.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedavg.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedopt.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedprox.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/krum.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/strategy/strategy.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/__init__.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/state/state.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/superlink/state/utils.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/typing.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/utils/__init__.py +0 -0
  217. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/utils/tensorboard.py +0 -0
  218. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/utils/validator.py +0 -0
  219. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/workflow/__init__.py +0 -0
  220. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/workflow/constant.py +0 -0
  221. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  222. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  223. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  224. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  225. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/simulation/__init__.py +0 -0
  226. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/simulation/app.py +0 -0
  227. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  228. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  229. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  230. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  231. {flwr_nightly-1.9.0.dev20240523 → flwr_nightly-1.9.0.dev20240527}/src/py/flwr/simulation/run_simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240523
3
+ Version: 1.9.0.dev20240527
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -39,9 +39,8 @@ Requires-Dist: numpy (>=1.21.0,<2.0.0)
39
39
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
40
40
  Requires-Dist: protobuf (>=4.25.2,<5.0.0)
41
41
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
42
- Requires-Dist: ray (==2.6.3) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
42
+ Requires-Dist: ray (==2.10.0) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
43
43
  Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
44
- Requires-Dist: setuptools (!=70.0.0)
45
44
  Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
46
45
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
47
46
  Requires-Dist: typer[all] (>=0.9.0,<0.10.0)
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.9.0.dev20240523"
7
+ version = "1.9.0.dev20240527"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -73,16 +73,15 @@ iterators = "^0.0.2"
73
73
  typer = { version = "^0.9.0", extras=["all"] }
74
74
  tomli = "^2.0.1"
75
75
  pathspec = "^0.12.1"
76
- setuptools = "!=70.0.0"
77
76
  # Optional dependencies (Simulation Engine)
78
- ray = { version = "==2.6.3", optional = true, python = ">=3.8,<3.12" }
77
+ ray = { version = "==2.10.0", optional = true, python = ">=3.8,<3.12" }
79
78
  # Optional dependencies (REST transport layer)
80
79
  requests = { version = "^2.31.0", optional = true }
81
80
  starlette = { version = "^0.31.0", optional = true }
82
81
  uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
83
82
 
84
83
  [tool.poetry.extras]
85
- simulation = ["ray", "pydantic"]
84
+ simulation = ["ray"]
86
85
  rest = ["requests", "starlette", "uvicorn"]
87
86
 
88
87
  [tool.poetry.group.dev.dependencies]
@@ -20,6 +20,7 @@ from logging import DEBUG, INFO, WARN
20
20
  from pathlib import Path
21
21
  from typing import Callable, Optional, Tuple
22
22
 
23
+ from cryptography.exceptions import UnsupportedAlgorithm
23
24
  from cryptography.hazmat.primitives.asymmetric import ec
24
25
  from cryptography.hazmat.primitives.serialization import (
25
26
  load_ssh_private_key,
@@ -31,9 +32,6 @@ from flwr.common import EventType, event
31
32
  from flwr.common.exit_handlers import register_exit_handlers
32
33
  from flwr.common.logger import log
33
34
  from flwr.common.object_ref import load_app, validate
34
- from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
35
- ssh_types_to_elliptic_curve,
36
- )
37
35
 
38
36
  from ..app import _start_client_internal
39
37
 
@@ -242,40 +240,60 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
242
240
  " Default: current working directory.",
243
241
  )
244
242
  parser.add_argument(
245
- "--authentication-keys",
246
- nargs=2,
247
- metavar=("CLIENT_PRIVATE_KEY", "CLIENT_PUBLIC_KEY"),
243
+ "--auth-supernode-private-key",
244
+ type=str,
245
+ help="The SuperNode's private key (as a path str) to enable authentication.",
246
+ )
247
+ parser.add_argument(
248
+ "--auth-supernode-public-key",
248
249
  type=str,
249
- help="Provide two file paths: (1) the client's private "
250
- "key file, and (2) the client's public key file.",
250
+ help="The SuperNode's public key (as a path str) to enable authentication.",
251
251
  )
252
252
 
253
253
 
254
254
  def _try_setup_client_authentication(
255
255
  args: argparse.Namespace,
256
256
  ) -> Optional[Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]]:
257
- if not args.authentication_keys:
257
+ if not args.auth_supernode_private_key and not args.auth_supernode_public_key:
258
258
  return None
259
259
 
260
- ssh_private_key = load_ssh_private_key(
261
- Path(args.authentication_keys[0]).read_bytes(),
262
- None,
263
- )
264
- ssh_public_key = load_ssh_public_key(Path(args.authentication_keys[1]).read_bytes())
260
+ if not args.auth_supernode_private_key or not args.auth_supernode_public_key:
261
+ sys.exit(
262
+ "Authentication requires file paths to both "
263
+ "'--auth-supernode-private-key' and '--auth-supernode-public-key'"
264
+ "to be provided (providing only one of them is not sufficient)."
265
+ )
266
+
267
+ try:
268
+ ssh_private_key = load_ssh_private_key(
269
+ Path(args.auth_supernode_private_key).read_bytes(),
270
+ None,
271
+ )
272
+ if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
273
+ raise ValueError()
274
+ except (ValueError, UnsupportedAlgorithm):
275
+ sys.exit(
276
+ "Error: Unable to parse the private key file in "
277
+ "'--auth-supernode-private-key'. Authentication requires elliptic "
278
+ "curve private and public key pair. Please ensure that the file "
279
+ "path points to a valid private key file and try again."
280
+ )
265
281
 
266
282
  try:
267
- client_private_key, client_public_key = ssh_types_to_elliptic_curve(
268
- ssh_private_key, ssh_public_key
283
+ ssh_public_key = load_ssh_public_key(
284
+ Path(args.auth_supernode_public_key).read_bytes()
269
285
  )
270
- except TypeError:
286
+ if not isinstance(ssh_public_key, ec.EllipticCurvePublicKey):
287
+ raise ValueError()
288
+ except (ValueError, UnsupportedAlgorithm):
271
289
  sys.exit(
272
- "The file paths provided could not be read as a private and public "
273
- "key pair. Client authentication requires an elliptic curve public and "
274
- "private key pair. Please provide the file paths containing elliptic "
275
- "curve private and public keys to '--authentication-keys'."
290
+ "Error: Unable to parse the public key file in "
291
+ "'--auth-supernode-public-key'. Authentication requires elliptic "
292
+ "curve private and public key pair. Please ensure that the file "
293
+ "path points to a valid public key file and try again."
276
294
  )
277
295
 
278
296
  return (
279
- client_private_key,
280
- client_public_key,
297
+ ssh_private_key,
298
+ ssh_public_key,
281
299
  )
@@ -35,6 +35,8 @@ from .typing import (
35
35
  Status,
36
36
  )
37
37
 
38
+ EMPTY_TENSOR_KEY = "_empty"
39
+
38
40
 
39
41
  def parametersrecord_to_parameters(
40
42
  record: ParametersRecord, keep_input: bool
@@ -59,7 +61,8 @@ def parametersrecord_to_parameters(
59
61
  parameters = Parameters(tensors=[], tensor_type="")
60
62
 
61
63
  for key in list(record.keys()):
62
- parameters.tensors.append(record[key].data)
64
+ if key != EMPTY_TENSOR_KEY:
65
+ parameters.tensors.append(record[key].data)
63
66
 
64
67
  if not parameters.tensor_type:
65
68
  # Setting from first array in record. Recall the warning in the docstrings
@@ -103,6 +106,10 @@ def parameters_to_parametersrecord(
103
106
  data=tensor, dtype="", stype=tensor_type, shape=[]
104
107
  )
105
108
 
109
+ if num_arrays == 0:
110
+ ordered_dict[EMPTY_TENSOR_KEY] = Array(
111
+ data=b"", dtype="", stype=tensor_type, shape=[]
112
+ )
106
113
  return ParametersRecord(ordered_dict, keep_input=keep_input)
107
114
 
108
115
 
@@ -117,18 +117,3 @@ def verify_hmac(key: bytes, message: bytes, hmac_value: bytes) -> bool:
117
117
  return True
118
118
  except InvalidSignature:
119
119
  return False
120
-
121
-
122
- def ssh_types_to_elliptic_curve(
123
- private_key: serialization.SSHPrivateKeyTypes,
124
- public_key: serialization.SSHPublicKeyTypes,
125
- ) -> Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]:
126
- """Cast SSH key types to elliptic curve."""
127
- if isinstance(private_key, ec.EllipticCurvePrivateKey) and isinstance(
128
- public_key, ec.EllipticCurvePublicKey
129
- ):
130
- return (private_key, public_key)
131
-
132
- raise TypeError(
133
- "The provided key is not an EllipticCurvePrivateKey or EllipticCurvePublicKey"
134
- )
@@ -15,7 +15,6 @@
15
15
  """Flower server app."""
16
16
 
17
17
  import argparse
18
- import asyncio
19
18
  import csv
20
19
  import importlib.util
21
20
  import sys
@@ -26,6 +25,7 @@ from pathlib import Path
26
25
  from typing import List, Optional, Sequence, Set, Tuple
27
26
 
28
27
  import grpc
28
+ from cryptography.exceptions import UnsupportedAlgorithm
29
29
  from cryptography.hazmat.primitives.asymmetric import ec
30
30
  from cryptography.hazmat.primitives.serialization import (
31
31
  load_ssh_private_key,
@@ -38,14 +38,12 @@ from flwr.common.constant import (
38
38
  MISSING_EXTRA_REST,
39
39
  TRANSPORT_TYPE_GRPC_RERE,
40
40
  TRANSPORT_TYPE_REST,
41
- TRANSPORT_TYPE_VCE,
42
41
  )
43
42
  from flwr.common.exit_handlers import register_exit_handlers
44
43
  from flwr.common.logger import log, warn_deprecated_feature
45
44
  from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
46
45
  private_key_to_bytes,
47
46
  public_key_to_bytes,
48
- ssh_types_to_elliptic_curve,
49
47
  )
50
48
  from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
51
49
  add_FleetServicer_to_server,
@@ -63,7 +61,6 @@ from .superlink.fleet.grpc_bidi.grpc_server import (
63
61
  )
64
62
  from .superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
65
63
  from .superlink.fleet.grpc_rere.server_interceptor import AuthenticateServerInterceptor
66
- from .superlink.fleet.vce import start_vce
67
64
  from .superlink.state import StateFactory
68
65
 
69
66
  ADDRESS_DRIVER_API = "0.0.0.0:9091"
@@ -401,17 +398,6 @@ def run_superlink() -> None:
401
398
  interceptors=interceptors,
402
399
  )
403
400
  grpc_servers.append(fleet_server)
404
- elif args.fleet_api_type == TRANSPORT_TYPE_VCE:
405
- f_stop = asyncio.Event() # Does nothing
406
- _run_fleet_api_vce(
407
- num_supernodes=args.num_supernodes,
408
- client_app_attr=args.client_app,
409
- backend_name=args.backend,
410
- backend_config_json_stream=args.backend_config,
411
- app_dir=args.app_dir,
412
- state_factory=state_factory,
413
- f_stop=f_stop,
414
- )
415
401
  else:
416
402
  raise ValueError(f"Unknown fleet_api_type: {args.fleet_api_type}")
417
403
 
@@ -435,44 +421,69 @@ def _try_setup_client_authentication(
435
421
  args: argparse.Namespace,
436
422
  certificates: Optional[Tuple[bytes, bytes, bytes]],
437
423
  ) -> Optional[Tuple[Set[bytes], ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]]:
438
- if not args.require_client_authentication:
424
+ if (
425
+ not args.auth_list_public_keys
426
+ and not args.auth_superlink_private_key
427
+ and not args.auth_superlink_public_key
428
+ ):
439
429
  return None
440
430
 
431
+ if (
432
+ not args.auth_list_public_keys
433
+ or not args.auth_superlink_private_key
434
+ or not args.auth_superlink_public_key
435
+ ):
436
+ sys.exit(
437
+ "Authentication requires providing file paths for "
438
+ "'--auth-list-public-keys', '--auth-superlink-private-key' and "
439
+ "'--auth-superlink-public-key'. Provide all three to enable authentication."
440
+ )
441
+
441
442
  if certificates is None:
442
443
  sys.exit(
443
- "Client authentication only works over secure connections. "
444
- "Please provide certificate paths using '--certificates' when "
445
- "enabling '--require-client-authentication'."
444
+ "Authentication requires secure connections. "
445
+ "Please provide certificate paths using '--certificates' and "
446
+ "try again."
446
447
  )
447
448
 
448
- client_keys_file_path = Path(args.require_client_authentication[0])
449
+ client_keys_file_path = Path(args.auth_list_public_keys)
449
450
  if not client_keys_file_path.exists():
450
451
  sys.exit(
451
- "The provided path to the client public keys CSV file does not exist: "
452
+ "The provided path to the known public keys CSV file does not exist: "
452
453
  f"{client_keys_file_path}. "
453
- "Please provide the CSV file path containing known client public keys "
454
- "to '--require-client-authentication'."
454
+ "Please provide the CSV file path containing known public keys "
455
+ "to '--auth-list-public-keys'."
455
456
  )
456
457
 
457
458
  client_public_keys: Set[bytes] = set()
458
- ssh_private_key = load_ssh_private_key(
459
- Path(args.require_client_authentication[1]).read_bytes(),
460
- None,
461
- )
462
- ssh_public_key = load_ssh_public_key(
463
- Path(args.require_client_authentication[2]).read_bytes()
464
- )
465
459
 
466
460
  try:
467
- server_private_key, server_public_key = ssh_types_to_elliptic_curve(
468
- ssh_private_key, ssh_public_key
461
+ ssh_private_key = load_ssh_private_key(
462
+ Path(args.auth_superlink_private_key).read_bytes(),
463
+ None,
469
464
  )
470
- except TypeError:
465
+ if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
466
+ raise ValueError()
467
+ except (ValueError, UnsupportedAlgorithm):
471
468
  sys.exit(
472
- "The file paths provided could not be read as a private and public "
473
- "key pair. Client authentication requires an elliptic curve public and "
474
- "private key pair. Please provide the file paths containing elliptic "
475
- "curve private and public keys to '--require-client-authentication'."
469
+ "Error: Unable to parse the private key file in "
470
+ "'--auth-superlink-private-key'. Authentication requires elliptic "
471
+ "curve private and public key pair. Please ensure that the file "
472
+ "path points to a valid private key file and try again."
473
+ )
474
+
475
+ try:
476
+ ssh_public_key = load_ssh_public_key(
477
+ Path(args.auth_superlink_public_key).read_bytes()
478
+ )
479
+ if not isinstance(ssh_public_key, ec.EllipticCurvePublicKey):
480
+ raise ValueError()
481
+ except (ValueError, UnsupportedAlgorithm):
482
+ sys.exit(
483
+ "Error: Unable to parse the public key file in "
484
+ "'--auth-superlink-public-key'. Authentication requires elliptic "
485
+ "curve private and public key pair. Please ensure that the file "
486
+ "path points to a valid public key file and try again."
476
487
  )
477
488
 
478
489
  with open(client_keys_file_path, newline="", encoding="utf-8") as csvfile:
@@ -484,14 +495,14 @@ def _try_setup_client_authentication(
484
495
  client_public_keys.add(public_key_to_bytes(public_key))
485
496
  else:
486
497
  sys.exit(
487
- "Error: Unable to parse the public keys in the .csv "
488
- "file. Please ensure that the .csv file contains valid "
489
- "SSH public keys and try again."
498
+ "Error: Unable to parse the public keys in the CSV "
499
+ "file. Please ensure that the CSV file path points to a valid "
500
+ "known SSH public keys files and try again."
490
501
  )
491
502
  return (
492
503
  client_public_keys,
493
- server_private_key,
494
- server_public_key,
504
+ ssh_private_key,
505
+ ssh_public_key,
495
506
  )
496
507
 
497
508
 
@@ -544,29 +555,6 @@ def _run_fleet_api_grpc_rere(
544
555
  return fleet_grpc_server
545
556
 
546
557
 
547
- # pylint: disable=too-many-arguments
548
- def _run_fleet_api_vce(
549
- num_supernodes: int,
550
- client_app_attr: str,
551
- backend_name: str,
552
- backend_config_json_stream: str,
553
- app_dir: str,
554
- state_factory: StateFactory,
555
- f_stop: asyncio.Event,
556
- ) -> None:
557
- log(INFO, "Flower VCE: Starting Fleet API (VirtualClientEngine)")
558
-
559
- start_vce(
560
- num_supernodes=num_supernodes,
561
- client_app_attr=client_app_attr,
562
- backend_name=backend_name,
563
- backend_config_json_stream=backend_config_json_stream,
564
- state_factory=state_factory,
565
- app_dir=app_dir,
566
- f_stop=f_stop,
567
- )
568
-
569
-
570
558
  # pylint: disable=import-outside-toplevel,too-many-arguments
571
559
  def _run_fleet_api_rest(
572
560
  host: str,
@@ -714,13 +702,20 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
714
702
  default=DATABASE,
715
703
  )
716
704
  parser.add_argument(
717
- "--require-client-authentication",
718
- nargs=3,
719
- metavar=("CLIENT_KEYS", "SERVER_PRIVATE_KEY", "SERVER_PUBLIC_KEY"),
705
+ "--auth-list-public-keys",
720
706
  type=str,
721
- help="Provide three file paths: (1) a .csv file containing a list of "
722
- "known client public keys for authentication, (2) the server's private "
723
- "key file, and (3) the server's public key file.",
707
+ help="A CSV file (as a path str) containing a list of known public "
708
+ "keys to enable authentication.",
709
+ )
710
+ parser.add_argument(
711
+ "--auth-superlink-private-key",
712
+ type=str,
713
+ help="The SuperLink's private key (as a path str) to enable authentication.",
714
+ )
715
+ parser.add_argument(
716
+ "--auth-superlink-public-key",
717
+ type=str,
718
+ help="The SuperLink's public key (as a path str) to enable authentication.",
724
719
  )
725
720
 
726
721
 
@@ -751,14 +746,6 @@ def _add_args_fleet_api(parser: argparse.ArgumentParser) -> None:
751
746
  help="Start a Fleet API server (REST, experimental)",
752
747
  )
753
748
 
754
- ex_group.add_argument(
755
- "--vce",
756
- action="store_const",
757
- dest="fleet_api_type",
758
- const=TRANSPORT_TYPE_VCE,
759
- help="Start a Fleet API server (VirtualClientEngine)",
760
- )
761
-
762
749
  # Fleet API gRPC-rere options
763
750
  grpc_rere_group = parser.add_argument_group(
764
751
  "Fleet API (gRPC-rere) server options", ""
@@ -794,36 +781,3 @@ def _add_args_fleet_api(parser: argparse.ArgumentParser) -> None:
794
781
  type=int,
795
782
  default=1,
796
783
  )
797
-
798
- # Fleet API VCE options
799
- vce_group = parser.add_argument_group("Fleet API (VCE) server options", "")
800
- vce_group.add_argument(
801
- "--client-app",
802
- help="For example: `client:app` or `project.package.module:wrapper.app`.",
803
- )
804
- vce_group.add_argument(
805
- "--num-supernodes",
806
- type=int,
807
- help="Number of simulated SuperNodes.",
808
- )
809
- vce_group.add_argument(
810
- "--backend",
811
- default="ray",
812
- type=str,
813
- help="Simulation backend that executes the ClientApp.",
814
- )
815
- vce_group.add_argument(
816
- "--backend-config",
817
- type=str,
818
- default='{"client_resources": {"num_cpus":1, "num_gpus":0.0}, "tensorflow": 0}',
819
- help='A JSON formatted stream, e.g \'{"<keyA>":<value>, "<keyB>":<value>}\' to '
820
- "configure a backend. Values supported in <value> are those included by "
821
- "`flwr.common.typing.ConfigsRecordValues`. ",
822
- )
823
- parser.add_argument(
824
- "--app-dir",
825
- default="",
826
- help="Add specified directory to the PYTHONPATH and load"
827
- "ClientApp from there."
828
- " Default: current working directory.",
829
- )