]> Cypherpunks.ru repositories - gogost.git/blob - src/cypherpunks.ru/gogost/gost3410/vko2012.go
41ff512dfa7258d1c9b113b09ed20b777be725b2
[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         "errors"
21         "math/big"
22
23         "cypherpunks.ru/gogost/gost34112012256"
24         "cypherpunks.ru/gogost/gost34112012512"
25 )
26
27 // RFC 7836 VKO GOST R 34.10-2012 256-bit key agreement function.
28 // UKM is user keying material, also called VKO-factor.
29 func (prv *PrivateKey) KEK2012256(pub *PublicKey, ukm *big.Int) ([]byte, error) {
30         if prv.Mode != Mode2012 {
31                 return nil, errors.New("KEK2012 can not be used in Mode2001")
32         }
33         key, err := prv.KEK(pub, ukm)
34         if err != nil {
35                 return nil, err
36         }
37         h := gost34112012256.New()
38         h.Write(key)
39         return h.Sum(key[:0]), nil
40 }
41
42 // RFC 7836 VKO GOST R 34.10-2012 512-bit key agreement function.
43 // UKM is user keying material, also called VKO-factor.
44 func (prv *PrivateKey) KEK2012512(pub *PublicKey, ukm *big.Int) ([]byte, error) {
45         if prv.Mode != Mode2012 {
46                 return nil, errors.New("KEK2012 can not be used in Mode2001")
47         }
48         key, err := prv.KEK(pub, ukm)
49         if err != nil {
50                 return nil, err
51         }
52         h := gost34112012512.New()
53         h.Write(key)
54         return h.Sum(key[:0]), nil
55 }