From 8ed245158dd501fd5f4a161eeb5007e6d0f8050b Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sun, 20 Nov 2016 00:17:40 +0300 Subject: [PATCH] VKO functions are the same, only hash function differs, simplify code --- pygost/gost3410_vko.py | 39 +++++++++++++++------------- pygost/stubs/pygost/gost3410_vko.pyi | 6 ++--- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/pygost/gost3410_vko.py b/pygost/gost3410_vko.py index 41b50f6..caf3b5b 100644 --- a/pygost/gost3410_vko.py +++ b/pygost/gost3410_vko.py @@ -33,13 +33,19 @@ def ukm_unmarshal(ukm): return bytes2long(ukm[::-1]) -def kek_34102001(curve, prv, pubkey, ukm): +def kek(curve, prv, pub, ukm, mode): + key = curve.exp(prv, pub[0], pub[1]) + key = curve.exp(ukm, key[0], key[1]) + return pub_marshal(key, mode) + + +def kek_34102001(curve, prv, pub, ukm): """ Make Diffie-Hellman computation (34.10-2001, 34.11-94) :param GOST3410Curve curve: curve to use :param long prv: private key - :param pubkey: public key - :type pubkey: (long, long) + :param pub: public key + :type pub: (long, long) :param long ukm: user keying material, VKO-factor :returns: Key Encryption Key (shared key) :rtype: bytes, 32 bytes @@ -48,38 +54,35 @@ def kek_34102001(curve, prv, pubkey, ukm): :rfc:`4357` VKO GOST R 34.10-2001 with little-endian hash output. """ - key = curve.exp(prv, pubkey[0], pubkey[1]) - key = curve.exp(ukm, key[0], key[1]) - return GOST341194(pub_marshal(key), "GostR3411_94_CryptoProParamSet").digest() + return GOST341194( + kek(curve, prv, pub, ukm, mode=2001), + "GostR3411_94_CryptoProParamSet", + ).digest() -def kek_34102012256(curve, prv, pubkey, ukm=1): +def kek_34102012256(curve, prv, pub, ukm=1): """ Make Diffie-Hellman computation (34.10-2012, 34.11-2012 256 bit) :param GOST3410Curve curve: curve to use :param long prv: private key - :param pubkey: public key - :type pubkey: (long, long) + :param pub: public key + :type pub: (long, long) :param long ukm: user keying material, VKO-factor :returns: Key Encryption Key (shared key) :rtype: bytes, 32 bytes """ - key = curve.exp(prv, pubkey[0], pubkey[1]) - key = curve.exp(ukm, key[0], key[1]) - return GOST34112012256(pub_marshal(key, mode=2012)).digest() + return GOST34112012256(kek(curve, prv, pub, ukm, mode=2012)).digest() -def kek_34102012512(curve, prv, pubkey, ukm=1): +def kek_34102012512(curve, prv, pub, ukm=1): """ Make Diffie-Hellman computation (34.10-2012, 34.11-2012 512 bit) :param GOST3410Curve curve: curve to use :param long prv: private key - :param pubkey: public key - :type pubkey: (long, long) + :param pub: public key + :type pub: (long, long) :param long ukm: user keying material, VKO-factor :returns: Key Encryption Key (shared key) :rtype: bytes, 32 bytes """ - key = curve.exp(prv, pubkey[0], pubkey[1]) - key = curve.exp(ukm, key[0], key[1]) - return GOST34112012512(pub_marshal(key, mode=2012)).digest() + return GOST34112012512(kek(curve, prv, pub, ukm, mode=2012)).digest() diff --git a/pygost/stubs/pygost/gost3410_vko.pyi b/pygost/stubs/pygost/gost3410_vko.pyi index d023a1e..c6d35e5 100644 --- a/pygost/stubs/pygost/gost3410_vko.pyi +++ b/pygost/stubs/pygost/gost3410_vko.pyi @@ -5,10 +5,10 @@ from pygost.gost3410 import PublicKey def ukm_unmarshal(ukm: bytes) -> int: ... -def kek_34102001(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: int) -> bytes: ... +def kek_34102001(curve: GOST3410Curve, prv: int, pub: PublicKey, ukm: int) -> bytes: ... -def kek_34102012256(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: int=...) -> bytes: ... +def kek_34102012256(curve: GOST3410Curve, prv: int, pub: PublicKey, ukm: int=...) -> bytes: ... -def kek_34102012512(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: int=...) -> bytes: ... +def kek_34102012512(curve: GOST3410Curve, prv: int, pub: PublicKey, ukm: int=...) -> bytes: ... -- 2.44.0