|  | @@ -1,7 +1,51 @@
 | 
	
		
			
				|  |  |  package dhellman
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import "git.ali33.ru/fcg-xvii/curve/v2/tools"
 | 
	
		
			
				|  |  | +import (
 | 
	
		
			
				|  |  | +	"context"
 | 
	
		
			
				|  |  | +	"errors"
 | 
	
		
			
				|  |  | +	"math/big"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	"git.ali33.ru/fcg-xvii/curve/v2"
 | 
	
		
			
				|  |  | +	"git.ali33.ru/fcg-xvii/curve/v2/tools"
 | 
	
		
			
				|  |  | +	"git.ali33.ru/fcg-xvii/go-tools/json"
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type curveKeyPublic struct {
 | 
	
		
			
				|  |  |  	p *tools.Point
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (s *curveKeyPublic) Map() json.Map {
 | 
	
		
			
				|  |  | +	return json.Map{
 | 
	
		
			
				|  |  | +		"p": s.p,
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (s *curveKeyPublic) MarshalJSON() ([]byte, error) {
 | 
	
		
			
				|  |  | +	return s.Map().JSON(), nil
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (s *curveKeyPublic) Attack(ctx context.Context) (curve.KeyPrivate, error) {
 | 
	
		
			
				|  |  | +	return s.attack(ctx)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (s *curveKeyPublic) attack(ctx context.Context) (*curveKeyPrivate, error) {
 | 
	
		
			
				|  |  | +	c := s.p.Curve()
 | 
	
		
			
				|  |  | +	tmp := big.NewInt(1)
 | 
	
		
			
				|  |  | +	for {
 | 
	
		
			
				|  |  | +		if tmp.Cmp(tools.Add64(c.P(), -1)) == 0 {
 | 
	
		
			
				|  |  | +			break
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		if pp, err := c.G().Mul(tmp); err == nil && pp.X().Cmp(s.p.X()) == 0 {
 | 
	
		
			
				|  |  | +			return &curveKeyPrivate{
 | 
	
		
			
				|  |  | +				x: tmp,
 | 
	
		
			
				|  |  | +			}, nil
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		select {
 | 
	
		
			
				|  |  | +		case <-ctx.Done():
 | 
	
		
			
				|  |  | +			return nil, errors.New("атака на метод диффи-хеллмана провалена: время вышло")
 | 
	
		
			
				|  |  | +		default:
 | 
	
		
			
				|  |  | +			tmp = tools.Add64(tmp, 1)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return nil, errors.New("атака на метод диффи-хеллмана провалена: время вышло")
 | 
	
		
			
				|  |  | +}
 |