]> Cypherpunks.ru repositories - gogost.git/blob - gost3413/padding.go
f0941418527e643df24ce2e6ae47ddec878f79e3
[gogost.git] / gost3413 / padding.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, version 3 of the License.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 // GOST R 34.13-2015 padding methods.
17 package gost3413
18
19 func PadSize(dataSize, blockSize int) int {
20         if dataSize < blockSize {
21                 return blockSize - dataSize
22         }
23         if dataSize%blockSize == 0 {
24                 return 0
25         }
26         return blockSize - dataSize%blockSize
27 }
28
29 func Pad1(data []byte, blockSize int) []byte {
30         padSize := PadSize(len(data), blockSize)
31         if padSize == 0 {
32                 return data
33         }
34         return append(data, make([]byte, padSize)...)
35 }
36
37 func Pad2(data []byte, blockSize int) []byte {
38         pad := make([]byte, 1+PadSize(len(data)+1, blockSize))
39         pad[0] = byte(0x80)
40         return append(data, pad...)
41 }
42
43 func Pad3(data []byte, blockSize int) []byte {
44         if PadSize(len(data), blockSize) == 0 {
45                 return data
46         }
47         return Pad2(data, blockSize)
48 }