ed25519.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # -*- coding: utf-8 -*-
  2. # Copyright 2014 OpenMarket Ltd
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. import nacl.encoding
  16. import nacl.signing
  17. import nacl.exceptions
  18. import signedjson.key
  19. import logging
  20. logger = logging.getLogger(__name__)
  21. class SydentEd25519:
  22. def __init__(self, syd):
  23. self.sydent = syd
  24. save_key = False
  25. sk_str = self.sydent.cfg.get('crypto', 'ed25519.signingkey')
  26. sk_parts = sk_str.split(' ')
  27. if sk_str == '':
  28. logger.info("This server does not yet have an ed25519 signing key. "+
  29. "Creating one and saving it in the config file.")
  30. self.signing_key = signedjson.key.generate_signing_key("0")
  31. save_key = True
  32. elif len(sk_parts) == 1:
  33. # old format key
  34. logger.info("Updating signing key format: brace yourselves")
  35. self.signing_key = nacl.signing.SigningKey(sk_str, encoder=nacl.encoding.HexEncoder)
  36. self.signing_key.version = "0"
  37. self.signing_key.alg = signedjson.key.NACL_ED25519
  38. save_key = True
  39. else:
  40. self.signing_key = signedjson.key.decode_signing_key_base64(
  41. sk_parts[0],
  42. sk_parts[1],
  43. sk_parts[2]
  44. )
  45. if save_key:
  46. sk_str = "%s %s %s" % (
  47. self.signing_key.alg,
  48. self.signing_key.version,
  49. signedjson.key.encode_signing_key_base64(self.signing_key)
  50. )
  51. self.sydent.cfg.set('crypto', 'ed25519.signingkey', sk_str)
  52. self.sydent.save_config()
  53. logger.info("Key saved")