X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=pygost%2Fgost3412.py;h=0dce23f4c0eefa4e3076b3055956ade3ff8b06e3;hb=9af4461c6af50f9cf83030867e7054d1f6311b32;hp=70c1c900b87a9ca8a5114bacee44cb146711f408;hpb=b79ed604b7580f2b1d4e3eeb8685a2924c8fc64f;p=pygost.git diff --git a/pygost/gost3412.py b/pygost/gost3412.py index 70c1c90..0dce23f 100644 --- a/pygost/gost3412.py +++ b/pygost/gost3412.py @@ -1,11 +1,10 @@ # coding: utf-8 # PyGOST -- Pure Python GOST cryptographic functions library -# Copyright (C) 2015-2016 Sergey Matveev +# Copyright (C) 2015-2021 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 -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# the Free Software Foundation, version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,18 +13,20 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -"""GOST 34.12-2015 128-bit block cipher Кузнечик (Kuznechik) - -:rfc:`7801`. Pay attention that 34.12-2015 also defines 64-bit block -cipher Магма (Magma) -- it is **not** implemented here, but in gost28147 -module. +"""GOST 34.12-2015 64 and 128 bit block ciphers (:rfc:`7801`) Several precalculations are performed during this module importing. """ +from pygost.gost28147 import block2ns as gost28147_block2ns +from pygost.gost28147 import decrypt as gost28147_decrypt +from pygost.gost28147 import encrypt as gost28147_encrypt +from pygost.gost28147 import ns2block as gost28147_ns2block from pygost.utils import strxor -from pygost.utils import xrange # pylint: disable=redefined-builtin +from pygost.utils import xrange + +KEYSIZE = 32 LC = bytearray(( 148, 32, 133, 16, 194, 192, 1, 251, 1, 192, 194, 16, 133, 32, 148, 1, @@ -121,9 +122,11 @@ def lp(blk): return L([PI[v] for v in blk]) -class GOST3412Kuz(object): +class GOST3412Kuznechik(object): """GOST 34.12-2015 128-bit block cipher Кузнечик (Kuznechik) """ + blocksize = 16 + def __init__(self, key): """ :param key: encryption/decryption key @@ -152,3 +155,32 @@ class GOST3412Kuz(object): for i in range(9, 0, -1): blk = [PIinv[v] for v in Linv(bytearray(strxor(self.ks[i], blk)))] return bytes(strxor(self.ks[0], blk)) + + +class GOST3412Magma(object): + """GOST 34.12-2015 64-bit block cipher Магма (Magma) + """ + blocksize = 8 + + def __init__(self, key): + """ + :param key: encryption/decryption key + :type key: bytes, 32 bytes + """ + # Backward compatibility key preparation for 28147-89 key schedule + self.key = b"".join(key[i * 4:i * 4 + 4][::-1] for i in range(8)) + self.sbox = "id-tc26-gost-28147-param-Z" + + def encrypt(self, blk): + return gost28147_ns2block(gost28147_encrypt( + self.sbox, + self.key, + gost28147_block2ns(blk[::-1]), + ))[::-1] + + def decrypt(self, blk): + return gost28147_ns2block(gost28147_decrypt( + self.sbox, + self.key, + gost28147_block2ns(blk[::-1]), + ))[::-1]