]> Cypherpunks.ru repositories - gogost.git/blob - src/cypherpunks.ru/gogost/gost3410/vko2012.go
KEK2012 can be used with 256 and 512 bit curves
[gogost.git] / src / cypherpunks.ru / gogost / gost3410 / vko2012.go
1 // GoGOST -- Pure Go GOST cryptographic functions library
2 // Copyright (C) 2015-2019 Sergey Matveev <stargrave@stargrave.org>
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 package gost3410
18
19 import (
20         "math/big"
21
22         "cypherpunks.ru/gogost/gost34112012256"
23         "cypherpunks.ru/gogost/gost34112012512"
24 )
25
26 // RFC 7836 VKO GOST R 34.10-2012 256-bit key agreement function.
27 // UKM is user keying material, also called VKO-factor.
28 func (prv *PrivateKey) KEK2012256(pub *PublicKey, ukm *big.Int) ([]byte, error) {
29         key, err := prv.KEK(pub, ukm)
30         if err != nil {
31                 return nil, err
32         }
33         h := gost34112012256.New()
34         h.Write(key)
35         return h.Sum(key[:0]), nil
36 }
37
38 // RFC 7836 VKO GOST R 34.10-2012 512-bit key agreement function.
39 // UKM is user keying material, also called VKO-factor.
40 func (prv *PrivateKey) KEK2012512(pub *PublicKey, ukm *big.Int) ([]byte, error) {
41         key, err := prv.KEK(pub, ukm)
42         if err != nil {
43                 return nil, err
44         }
45         h := gost34112012512.New()
46         h.Write(key)
47         return h.Sum(key[:0]), nil
48 }