X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=gost3410%2Fpublic.go;h=ef5926bc336a03705ef44eaceb00f4656cc574bb;hb=e077d5f903e233fbefed0815be21be5f8f482017;hp=957293e61f7830b266a7f0731729b989dac8d0d0;hpb=c19a111af499e05273906e9d5f7c059ab38d6f02;p=gogost.git diff --git a/gost3410/public.go b/gost3410/public.go index 957293e..ef5926b 100644 --- a/gost3410/public.go +++ b/gost3410/public.go @@ -23,11 +23,11 @@ import ( type PublicKey struct { C *Curve - X *big.Int - Y *big.Int + X, Y *big.Int } -func NewPublicKey(c *Curve, raw []byte) (*PublicKey, error) { +// Unmarshal LE(X)||LE(Y) public key. "raw" must be 2*c.PointSize() length. +func NewPublicKeyLE(c *Curve, raw []byte) (*PublicKey, error) { pointSize := c.PointSize() key := make([]byte, 2*pointSize) if len(raw) != len(key) { @@ -43,7 +43,26 @@ func NewPublicKey(c *Curve, raw []byte) (*PublicKey, error) { }, nil } -func (pub *PublicKey) Raw() []byte { +// Unmarshal BE(X)||BE(Y) public key. "raw" must be 2*c.PointSize() length. +func NewPublicKeyBE(c *Curve, raw []byte) (*PublicKey, error) { + pointSize := c.PointSize() + if len(raw) != 2*pointSize { + return nil, fmt.Errorf("gogost/gost3410: len(key) != %d", 2*pointSize) + } + return &PublicKey{ + c, + bytes2big(raw[:pointSize]), + bytes2big(raw[pointSize:]), + }, nil +} + +// This is an alias for NewPublicKeyLE(). +func NewPublicKey(c *Curve, raw []byte) (*PublicKey, error) { + return NewPublicKeyLE(c, raw) +} + +// Marshal LE(X)||LE(Y) public key. raw will be 2*pub.C.PointSize() length. +func (pub *PublicKey) RawLE() []byte { pointSize := pub.C.PointSize() raw := append( pad(pub.Y.Bytes(), pointSize), @@ -53,6 +72,20 @@ func (pub *PublicKey) Raw() []byte { return raw } +// Marshal BE(X)||BE(Y) public key. raw will be 2*pub.C.PointSize() length. +func (pub *PublicKey) RawBE() []byte { + pointSize := pub.C.PointSize() + return append( + pad(pub.X.Bytes(), pointSize), + pad(pub.Y.Bytes(), pointSize)..., + ) +} + +// This is an alias for RawLE(). +func (pub *PublicKey) Raw() []byte { + return pub.RawLE() +} + func (pub *PublicKey) VerifyDigest(digest, signature []byte) (bool, error) { pointSize := pub.C.PointSize() if len(signature) != 2*pointSize {