12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package dhellman
- import (
- "errors"
- "git.ali33.ru/fcg-xvii/curve/v2"
- "git.ali33.ru/fcg-xvii/curve/v2/tools"
- "git.ali33.ru/fcg-xvii/go-tools/json"
- )
- func randomCurveKeyPair(curve *tools.Curve) (*curveKeyPair, error) {
- pair := curveKeyPair{
- curve: curve,
- }
- var err error
- if pair.priv, err = randomCurveKeyPrivate(curve); err != nil {
- return nil, err
- }
- var pub *tools.Point
- if pub, err = curve.G().Mul(pair.priv.x); err != nil {
- return nil, err
- }
- pair.pub = &curveKeyPublic{
- p: pub,
- }
- return &pair, nil
- }
- type curveKeyPair struct {
- priv *curveKeyPrivate
- pub *curveKeyPublic
- curve *tools.Curve
- }
- func (s *curveKeyPair) Map() json.Map {
- return json.Map{
- "private": s.priv.Map(),
- "public": s.pub.Map(),
- }
- }
- func (s *curveKeyPair) MarshalJSON() ([]byte, error) {
- return s.Map().JSON(), nil
- }
- func (s *curveKeyPair) KeyPrivate() curve.KeyPrivate {
- return s.priv
- }
- func (s *curveKeyPair) KeyPublic() curve.KeyPublic {
- return s.pub
- }
- func (s *curveKeyPair) MessageEncode(data []byte, args ...any) (curve.Message, error) {
- if len(args) == 0 {
- return nil, errors.New("Не найден публичный ключ принимающей стороны")
- }
- pub, check := args[0].(*curveKeyPublic)
- if !check {
- return nil, errors.New("Неверный тип аргумента - публичный ключ принимающей стороны")
- }
- encoded, err := s.messageEncode(data, pub)
- if err != nil {
- return nil, err
- }
- mes := &message{
- encoded: encoded,
- }
- return mes, err
- }
- func (s *curveKeyPair) MessageDecode(mes curve.Message, args ...any) ([]byte, error) {
- if len(args) == 0 {
- return nil, errors.New("Не найден публичный ключ отправляющей стороны")
- }
- pub, check := args[0].(*curveKeyPublic)
- if !check {
- return nil, errors.New("Неверный тип аргумента - публичный ключ отправляющей стороны")
- }
- return s.messageDecode(mes.Encoded(), pub)
- }
- func (s *curveKeyPair) messageEncode(data []byte, pub *curveKeyPublic) ([]byte, error) {
- sec, err := s.priv.secret(pub, s.curve)
- if err != nil {
- return nil, err
- }
- return aesEncode(data, sec)
- }
- func (s *curveKeyPair) messageDecode(encoded []byte, pub *curveKeyPublic) ([]byte, error) {
- sec, err := s.priv.secret(pub, s.curve)
- if err != nil {
- return nil, err
- }
- return aesEncode(encoded, sec)
- }
|