curve_key_pair.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package dhellman
  2. import (
  3. "errors"
  4. "log"
  5. "git.ali33.ru/fcg-xvii/curve/v2"
  6. "git.ali33.ru/fcg-xvii/curve/v2/tools"
  7. "git.ali33.ru/fcg-xvii/go-tools/json"
  8. )
  9. func randomCurveKeyPair(curve *tools.Curve) (*curveKeyPair, error) {
  10. pair := curveKeyPair{
  11. curve: curve,
  12. }
  13. var err error
  14. if pair.priv, err = randomCurveKeyPrivate(curve); err != nil {
  15. return nil, err
  16. }
  17. var pub *tools.Point
  18. if pub, err = curve.G().Mul(pair.priv.x); err != nil {
  19. return nil, err
  20. }
  21. pair.pub = &curveKeyPublic{
  22. p: pub,
  23. }
  24. return &pair, nil
  25. }
  26. type curveKeyPair struct {
  27. priv *curveKeyPrivate
  28. pub *curveKeyPublic
  29. curve *tools.Curve
  30. }
  31. func (s *curveKeyPair) Map() json.Map {
  32. return json.Map{
  33. "private": s.priv.Map(),
  34. "public": s.pub.Map(),
  35. }
  36. }
  37. func (s *curveKeyPair) MarshalJSON() ([]byte, error) {
  38. return s.Map().JSON(), nil
  39. }
  40. func (s *curveKeyPair) KeyPrivate() curve.KeyPrivate {
  41. return s.priv
  42. }
  43. func (s *curveKeyPair) KeyPublic() curve.KeyPublic {
  44. return s.pub
  45. }
  46. func (s *curveKeyPair) MessageEncode(data []byte, args ...any) (curve.Message, error) {
  47. if len(args) == 0 {
  48. return nil, errors.New("Не найден публичный ключ принимающей стороны")
  49. }
  50. pub, check := args[0].(*curveKeyPublic)
  51. if !check {
  52. return nil, errors.New("Неверный тип аргумента - публичный ключ принимающей стороны")
  53. }
  54. encoded, err := s.messageEncode(data, pub)
  55. if err != nil {
  56. return nil, err
  57. }
  58. mes := &message{
  59. encoded: encoded,
  60. }
  61. return mes, err
  62. }
  63. func (s *curveKeyPair) MessageDecode(mes curve.Message, args ...any) ([]byte, error) {
  64. if len(args) == 0 {
  65. return nil, errors.New("Не найден публичный ключ отправляющей стороны")
  66. }
  67. pub, check := args[0].(*curveKeyPublic)
  68. if !check {
  69. return nil, errors.New("Неверный тип аргумента - публичный ключ отправляющей стороны")
  70. }
  71. return s.messageDecode(mes.Encoded(), pub)
  72. }
  73. func (s *curveKeyPair) messageEncode(data []byte, pub *curveKeyPublic) ([]byte, error) {
  74. sec, err := s.priv.secret(pub)
  75. if err != nil {
  76. return nil, err
  77. }
  78. return aesEncode(data, sec)
  79. }
  80. func (s *curveKeyPair) messageDecode(encoded []byte, pub *curveKeyPublic) ([]byte, error) {
  81. sec, err := s.priv.secret(pub)
  82. log.Println("SECRET", sec)
  83. if err != nil {
  84. return nil, err
  85. }
  86. return aesDecode(encoded, sec)
  87. }