curve.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package elgamal
  2. import (
  3. "context"
  4. "fmt"
  5. "math/big"
  6. "git.ali33.ru/fcg-xvii/curve/v2/tools"
  7. )
  8. func NewCurve(c *tools.Curve, ctx context.Context) (*Curve, error) {
  9. cc := &Curve{
  10. Curve: c,
  11. }
  12. return cc, cc.setupDataTable(ctx)
  13. }
  14. type Curve struct {
  15. *tools.Curve
  16. dTable map[byte]*tools.Point
  17. }
  18. func (s *Curve) bytePoint(p *tools.Point) (byte, error) {
  19. for key, val := range s.dTable {
  20. if val.IsEqual(p) {
  21. return key, nil
  22. }
  23. }
  24. return 0, fmt.Errorf("Не найден символ, соответствующий точке %v", p)
  25. }
  26. // Заполнение таблицы байт -> точка на кривой
  27. func (s *Curve) setupDataTable(ctx context.Context) error {
  28. s.dTable = make(map[byte]*tools.Point)
  29. /*
  30. dx := big.NewInt(1)
  31. for i := byte(0); i <= 254; i++ {
  32. // поиск точки
  33. p, _, err := s.SearchClosePoints(dx, ctx)
  34. if err != nil {
  35. return err
  36. }
  37. // check already exists - todo
  38. dx = tools.Add64(p.X(), 2)
  39. s.dTable[i] = p
  40. log.Println(i, p)
  41. }
  42. */
  43. g := s.G()
  44. for i := int64(0); i <= 254; i++ {
  45. p, _ := g.Mul(big.NewInt(i + 1))
  46. s.dTable[byte(i)] = p
  47. }
  48. return nil
  49. }