X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=gost3410%2Fpublic.go;h=79f00f441261a14bfcda14cc417531e4e86c0daa;hb=6d9056bfe4a2d69469a1e70f3bf08f89b377b06e;hp=de2d858c604d793d559c5b11fcdab47fdcc04761;hpb=0da4d634ac5368d024489baf4bdd5d422b84dd84;p=gogost.git diff --git a/gost3410/public.go b/gost3410/public.go index de2d858..79f00f4 100644 --- a/gost3410/public.go +++ b/gost3410/public.go @@ -1,5 +1,5 @@ // GoGOST -- Pure Go GOST cryptographic functions library -// Copyright (C) 2015-2019 Sergey Matveev +// Copyright (C) 2015-2021 Sergey Matveev // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -21,14 +21,14 @@ import ( ) type PublicKey struct { - C *Curve - Mode Mode - X *big.Int - Y *big.Int + C *Curve + X *big.Int + Y *big.Int } -func NewPublicKey(curve *Curve, mode Mode, raw []byte) (*PublicKey, error) { - key := make([]byte, 2*int(mode)) +func NewPublicKey(curve *Curve, raw []byte) (*PublicKey, error) { + pointSize := curve.PointSize() + key := make([]byte, 2*pointSize) if len(raw) != len(key) { return nil, fmt.Errorf("gogost/gost3410: len(key) != %d", len(key)) } @@ -37,27 +37,28 @@ func NewPublicKey(curve *Curve, mode Mode, raw []byte) (*PublicKey, error) { } return &PublicKey{ curve, - mode, - bytes2big(key[int(mode) : 2*int(mode)]), - bytes2big(key[:int(mode)]), + bytes2big(key[pointSize : 2*pointSize]), + bytes2big(key[:pointSize]), }, nil } func (pub *PublicKey) Raw() []byte { + pointSize := pub.C.PointSize() raw := append( - pad(pub.Y.Bytes(), int(pub.Mode)), - pad(pub.X.Bytes(), int(pub.Mode))..., + pad(pub.Y.Bytes(), pointSize), + pad(pub.X.Bytes(), pointSize)..., ) reverse(raw) return raw } func (pub *PublicKey) VerifyDigest(digest, signature []byte) (bool, error) { - if len(signature) != 2*int(pub.Mode) { - return false, fmt.Errorf("gogost/gost3410: len(signature) != %d", 2*int(pub.Mode)) + pointSize := pub.C.PointSize() + if len(signature) != 2*pointSize { + return false, fmt.Errorf("gogost/gost3410: len(signature) != %d", 2*pointSize) } - s := bytes2big(signature[:pub.Mode]) - r := bytes2big(signature[pub.Mode:]) + s := bytes2big(signature[:pointSize]) + r := bytes2big(signature[pointSize:]) if r.Cmp(zero) <= 0 || r.Cmp(pub.C.Q) >= 0 || s.Cmp(zero) <= 0 ||