# coding: utf-8
# PyGOST -- Pure Python GOST cryptographic functions library
-# Copyright (C) 2015-2020 Sergey Matveev <stargrave@stargrave.org>
+# Copyright (C) 2015-2023 Sergey Matveev <stargrave@stargrave.org>
#
# 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
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-""" GOST R 34.13-2015: Modes of operation for block ciphers
+"""GOST R 34.13-2015: Modes of operation for block ciphers
This module currently includes only padding methods.
"""
+from os import urandom
+
from pygost.utils import bytes2long
from pygost.utils import long2bytes
from pygost.utils import strxor
strxor(pad3(tail, bs), prev),
k1 if len(tail) == bs else k2,
))
+
+
+def pad_iso10126(data, blocksize):
+ """ISO 10126 padding
+
+ Does not exist in 34.13, but added for convenience.
+ It uses urandom call for getting the randomness.
+ """
+ pad_len = blocksize - len(data) % blocksize
+ if pad_len == 0:
+ pad_len = blocksize
+ return b"".join((data, urandom(pad_len - 1), bytes((pad_len,))))
+
+
+def unpad_iso10126(data, blocksize):
+ """Unpad :py:func:`pygost.gost3413.pad_iso10126`
+ """
+ if len(data) % blocksize != 0:
+ raise ValueError("Data length is not multiple of blocksize")
+ pad_len = bytearray(data)[-1]
+ if pad_len > blocksize:
+ raise ValueError("Padding length is bigger than blocksize")
+ return data[:-pad_len]