X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=gost3410%2Fvko2001.go;h=7ba7ba44373eb08a3b0b803fc9a531da32afe4e0;hb=e38f7b828c16660814ac5b55b53644b3822e067b;hp=ed49d8f00fbb423f4991dc650bad9a618bd38800;hpb=c07494bbd559b9d00f391e28cfd070e18afe9900;p=gogost.git diff --git a/gost3410/vko2001.go b/gost3410/vko2001.go index ed49d8f..7ba7ba4 100644 --- a/gost3410/vko2001.go +++ b/gost3410/vko2001.go @@ -1,5 +1,5 @@ // GoGOST -- Pure Go GOST cryptographic functions library -// Copyright (C) 2015-2019 Sergey Matveev +// Copyright (C) 2015-2020 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 @@ -19,21 +19,23 @@ import ( "errors" "math/big" - "go.cypherpunks.ru/gogost/v4/gost28147" - "go.cypherpunks.ru/gogost/v4/gost341194" + "go.cypherpunks.ru/gogost/v5/gost28147" + "go.cypherpunks.ru/gogost/v5/gost341194" ) // RFC 4357 VKO GOST R 34.10-2001 key agreement function. // UKM is user keying material, also called VKO-factor. func (prv *PrivateKey) KEK2001(pub *PublicKey, ukm *big.Int) ([]byte, error) { - if prv.Mode != Mode2001 { - return nil, errors.New("KEK2001 can not be used in Mode2012") + if prv.C.PointSize() != 32 { + return nil, errors.New("gogost/gost3410: KEK2001 is only for 256-bit curves") } key, err := prv.KEK(pub, ukm) if err != nil { return nil, err } h := gost341194.New(&gost28147.SboxIdGostR341194CryptoProParamSet) - h.Write(key) + if _, err = h.Write(key); err != nil { + return nil, err + } return h.Sum(key[:0]), nil }