From: Sergey Matveev Date: Mon, 19 Oct 2020 09:57:49 +0000 (+0300) Subject: gost3410_vko checks if pub is on the curve X-Git-Tag: 5.2~7 X-Git-Url: http://www.git.cypherpunks.ru/?p=pygost.git;a=commitdiff_plain;h=e2f15375a1eaa167f2c1af7e393d6db54afdffdb gost3410_vko checks if pub is on the curve --- diff --git a/news.texi b/news.texi index b0c6933..6ff2525 100644 --- a/news.texi +++ b/news.texi @@ -8,6 +8,8 @@ @itemize @item @code{GOST3410Curve} has @code{.contains(point)} method for checking if point is on the curve. + @item @code{gost3410_vko} functions check if remote peer's public + key is on the curve. @end itemize @anchor{Release 5.1} diff --git a/pygost/gost3410_vko.py b/pygost/gost3410_vko.py index 0d49838..6c52f6d 100644 --- a/pygost/gost3410_vko.py +++ b/pygost/gost3410_vko.py @@ -33,6 +33,8 @@ def ukm_unmarshal(ukm): def kek(curve, prv, pub, ukm): + if not curve.contains(pub): + raise ValueError("pub is not on the curve") key = curve.exp(prv, pub[0], pub[1]) key = curve.exp(curve.cofactor * ukm, key[0], key[1]) return pub_marshal(key) diff --git a/pygost/test_gost3410_vko.py b/pygost/test_gost3410_vko.py index 8305350..1b48e2e 100644 --- a/pygost/test_gost3410_vko.py +++ b/pygost/test_gost3410_vko.py @@ -72,7 +72,7 @@ class TestVKO34102012256(TestCase): self.assertSequenceEqual(kek_34102012256(curve, prvB, pubA, ukm), vko) def test_sequence(self): - curve = CURVES["id-tc26-gost-3410-12-512-paramSetA"] + curve = CURVES["id-tc26-gost-3410-2012-256-paramSetA"] for _ in range(10): ukm = ukm_unmarshal(urandom(8)) prv1 = bytes2long(urandom(32)) @@ -86,6 +86,14 @@ class TestVKO34102012256(TestCase): kek2 = kek_34102012256(curve, prv2, pub2, ukm) self.assertNotEqual(kek1, kek2) + def test_pub_is_not_on_curve(self): + with self.assertRaises(ValueError): + kek_34102012256( + CURVES["id-tc26-gost-3410-2012-256-paramSetA"], + bytes2long(urandom(32)), + pub_unmarshal(urandom(64)), + ) + class TestVKO34102012512(TestCase): """RFC 7836