123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package elgamal
- import (
- "context"
- "fmt"
- "math/big"
- "git.ali33.ru/fcg-xvii/curve/v2/tools"
- "git.ali33.ru/fcg-xvii/go-tools/json"
- )
- func NewCurve(c *tools.Curve, ctx context.Context) (*Curve, error) {
- cc := &Curve{
- Curve: c,
- }
- return cc, cc.setupDataTable(ctx)
- }
- type Curve struct {
- *tools.Curve
- dTable map[byte]*tools.Point
- }
- func (s *Curve) Map() json.Map {
- return json.Map{
- "curve": s.Curve.Map(),
- "d-table": s.dTable,
- }
- }
- func (s *Curve) bytePoint(p *tools.Point) (byte, error) {
- for key, val := range s.dTable {
- if val.IsEqual(p) {
- return key, nil
- }
- }
- return 0, fmt.Errorf("Не найден символ, соответствующий точке %v", p)
- }
- // Заполнение таблицы байт -> точка на кривой
- func (s *Curve) setupDataTable(ctx context.Context) error {
- s.dTable = make(map[byte]*tools.Point)
- /*
- dx := big.NewInt(1)
- for i := byte(0); i <= 254; i++ {
- // поиск точки
- p, _, err := s.SearchClosePoints(dx, ctx)
- if err != nil {
- return err
- }
- // check already exists - todo
- dx = tools.Add64(p.X(), 2)
- s.dTable[i] = p
- log.Println(i, p)
- }
- */
- g := s.G()
- for i := int64(0); i <= 254; i++ {
- p, _ := g.Mul(big.NewInt(i + 1))
- s.dTable[byte(i)] = p
- }
- return nil
- }
|