X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=pygost%2Ftest_gost28147.py;h=5e9da8d10d4805b91fb409ea0d29e1faf4c24b4d;hb=31b08d5a78505f0ae1a144e58d023d84eda2cc6e;hp=037b7b86ff643502eccc928774c3eafae6665645;hpb=dd0805888217ef624c159baad44c2488101d5750;p=pygost.git diff --git a/pygost/test_gost28147.py b/pygost/test_gost28147.py index 037b7b8..5e9da8d 100644 --- a/pygost/test_gost28147.py +++ b/pygost/test_gost28147.py @@ -1,11 +1,10 @@ # coding: utf-8 # PyGOST -- Pure Python GOST cryptographic functions library -# Copyright (C) 2015-2018 Sergey Matveev +# Copyright (C) 2015-2020 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 @@ -19,6 +18,7 @@ from os import urandom from unittest import TestCase from pygost.gost28147 import block2ns +from pygost.gost28147 import BLOCKSIZE from pygost.gost28147 import cbc_decrypt from pygost.gost28147 import cbc_encrypt from pygost.gost28147 import cfb_decrypt @@ -28,6 +28,7 @@ from pygost.gost28147 import DEFAULT_SBOX from pygost.gost28147 import ecb_decrypt from pygost.gost28147 import ecb_encrypt from pygost.gost28147 import encrypt +from pygost.gost28147 import KEYSIZE from pygost.gost28147 import MESH_MAX_DATA from pygost.gost28147 import ns2block from pygost.utils import hexdec @@ -36,9 +37,9 @@ from pygost.utils import strxor class ECBTest(TestCase): def test_gcl(self): - """ Test vectors from libgcl3 + """Test vectors from libgcl3 """ - sbox = "Gost2814789_TestParamSet" + sbox = "id-Gost28147-89-TestParamSet" key = hexdec(b"0475f6e05038fbfad2c7c390edb3ca3d1547124291ae1e8a2f79cd9ed2bcefbd") plaintext = bytes(bytearray(( 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, @@ -109,12 +110,12 @@ class ECBTest(TestCase): 0x5a, 0x5f, 0xca, 0x58, 0x9a, 0xb2, 0x2d, 0xb2, ))) encrypted = ecb_encrypt(key, plaintext, sbox=sbox) - self.assertEqual(encrypted, ciphertext) + self.assertSequenceEqual(encrypted, ciphertext) decrypted = ecb_decrypt(key, encrypted, sbox=sbox) - self.assertEqual(decrypted, plaintext) + self.assertSequenceEqual(decrypted, plaintext) def test_cryptopp(self): - """ Test vectors from Crypto++ 5.6.2 + """Test vectors from Crypto++ 5.6.2 """ sbox = "AppliedCryptography" data = ( @@ -131,14 +132,14 @@ class ECBTest(TestCase): key = hexdec(key) pt = hexdec(pt) ct = hexdec(ct) - self.assertEqual(ecb_encrypt(key, pt, sbox=sbox), ct) + self.assertSequenceEqual(ecb_encrypt(key, pt, sbox=sbox), ct) def test_cryptomanager(self): - """ Test vector from http://cryptomanager.com/tv.html + """Test vector from http://cryptomanager.com/tv.html """ - sbox = "GostR3411_94_TestParamSet" + sbox = "id-GostR3411-94-TestParamSet" key = hexdec(b"75713134B60FEC45A607BB83AA3746AF4FF99DA6D1B53B5B1B402A1BAA030D1B") - self.assertEqual( + self.assertSequenceEqual( ecb_encrypt(key, hexdec(b"1122334455667788"), sbox=sbox), hexdec(b"03251E14F9D28ACB"), ) @@ -146,11 +147,11 @@ class ECBTest(TestCase): class CFBTest(TestCase): def test_cryptomanager(self): - """ Test vector from http://cryptomanager.com/tv.html + """Test vector from http://cryptomanager.com/tv.html """ key = hexdec(b"75713134B60FEC45A607BB83AA3746AF4FF99DA6D1B53B5B1B402A1BAA030D1B") - sbox = "GostR3411_94_TestParamSet" - self.assertEqual( + sbox = "id-GostR3411-94-TestParamSet" + self.assertSequenceEqual( cfb_encrypt( key, hexdec(b"112233445566778899AABBCCDD800000"), @@ -159,7 +160,7 @@ class CFBTest(TestCase): ), hexdec(b"6EE84586DD2BCA0CAD3616940E164242"), ) - self.assertEqual( + self.assertSequenceEqual( cfb_decrypt( key, hexdec(b"6EE84586DD2BCA0CAD3616940E164242"), @@ -170,45 +171,46 @@ class CFBTest(TestCase): ) def test_steps(self): - """ Check step-by-step operation manually + """Check step-by-step operation manually """ - key = urandom(32) - iv = urandom(8) + key = urandom(KEYSIZE) + iv = urandom(BLOCKSIZE) plaintext = urandom(20) ciphertext = cfb_encrypt(key, plaintext, iv) # First full block step = encrypt(DEFAULT_SBOX, key, block2ns(iv)) step = strxor(plaintext[:8], ns2block(step)) - self.assertEqual(step, ciphertext[:8]) + self.assertSequenceEqual(step, ciphertext[:8]) # Second full block step = encrypt(DEFAULT_SBOX, key, block2ns(step)) step = strxor(plaintext[8:16], ns2block(step)) - self.assertEqual(step, ciphertext[8:16]) + self.assertSequenceEqual(step, ciphertext[8:16]) # Third non-full block step = encrypt(DEFAULT_SBOX, key, block2ns(step)) step = strxor(plaintext[16:] + 4 * b"\x00", ns2block(step)) - self.assertEqual(step[:4], ciphertext[16:]) + self.assertSequenceEqual(step[:4], ciphertext[16:]) def test_random(self): - """ Random data with various sizes + """Random data with various sizes """ - key = urandom(32) - iv = urandom(8) + key = urandom(KEYSIZE) + iv = urandom(BLOCKSIZE) for size in (5, 8, 16, 120): pt = urandom(size) - self.assertEqual( - cfb_decrypt(key, cfb_encrypt(key, pt, iv), iv), pt, + self.assertSequenceEqual( + cfb_decrypt(key, cfb_encrypt(key, pt, iv), iv), + pt, ) class CTRTest(TestCase): def test_gcl(self): - """ Test vectors from libgcl3 + """Test vectors from libgcl3 """ - sbox = "Gost2814789_TestParamSet" + sbox = "id-Gost28147-89-TestParamSet" key = hexdec(b"0475f6e05038fbfad2c7c390edb3ca3d1547124291ae1e8a2f79cd9ed2bcefbd") plaintext = bytes(bytearray(( 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, @@ -280,14 +282,14 @@ class CTRTest(TestCase): ))) iv = b"\x02\x01\x01\x01\x01\x01\x01\x01" encrypted = cnt(key, plaintext, iv=iv, sbox=sbox) - self.assertEqual(encrypted, ciphertext) + self.assertSequenceEqual(encrypted, ciphertext) decrypted = cnt(key, encrypted, iv=iv, sbox=sbox) - self.assertEqual(decrypted, plaintext) + self.assertSequenceEqual(decrypted, plaintext) def test_gcl2(self): - """ Test vectors 2 from libgcl3 + """Test vectors 2 from libgcl3 """ - sbox = "Gost2814789_TestParamSet" + sbox = "id-Gost28147-89-TestParamSet" key = hexdec(b"fc7ad2886f455b50d29008fa622b57d5c65b3c637202025799cadf0768519e8a") plaintext = bytes(bytearray(( 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, @@ -307,16 +309,16 @@ class CTRTest(TestCase): 0x13, 0xcc, 0x55, 0x38, 0xb5, 0x63, 0x32, 0xc5, 0x23, 0xa4, 0xcb, 0x7d, 0x51, ))) - iv = 8 * b"\x00" + iv = BLOCKSIZE * b"\x00" encrypted = cnt(key, plaintext, iv=iv, sbox=sbox) - self.assertEqual(encrypted, ciphertext) + self.assertSequenceEqual(encrypted, ciphertext) decrypted = cnt(key, encrypted, iv=iv, sbox=sbox) - self.assertEqual(decrypted, plaintext) + self.assertSequenceEqual(decrypted, plaintext) class CBCTest(TestCase): def test_pad_requirement(self): - key = 32 * b"x" + key = KEYSIZE * b"x" for s in (b"", b"foo", b"foobarbaz"): with self.assertRaises(ValueError): cbc_encrypt(key, s, pad=False) @@ -324,59 +326,59 @@ class CBCTest(TestCase): cbc_decrypt(key, s, pad=False) def test_passes(self): - iv = urandom(8) - key = 32 * b"x" + iv = urandom(BLOCKSIZE) + key = KEYSIZE * b"x" for pt in (b"foo", b"foobarba", b"foobarbaz", 16 * b"x"): ct = cbc_encrypt(key, pt, iv) dt = cbc_decrypt(key, ct) - self.assertEqual(pt, dt) + self.assertSequenceEqual(pt, dt) def test_iv_existence_check(self): - key = 32 * b"x" + key = KEYSIZE * b"x" with self.assertRaises(ValueError): - cbc_decrypt(key, 8 * b"x") - iv = urandom(8) - cbc_decrypt(key, cbc_encrypt(key, 8 * b"x", iv)) + cbc_decrypt(key, BLOCKSIZE * b"x") + iv = urandom(BLOCKSIZE) + cbc_decrypt(key, cbc_encrypt(key, BLOCKSIZE * b"x", iv)) def test_meshing(self): pt = urandom(MESH_MAX_DATA * 3) - key = urandom(32) + key = urandom(KEYSIZE) ct = cbc_encrypt(key, pt) dt = cbc_decrypt(key, ct) - self.assertEqual(pt, dt) + self.assertSequenceEqual(pt, dt) class CFBMeshingTest(TestCase): def setUp(self): - self.key = urandom(32) - self.iv = urandom(8) + self.key = urandom(KEYSIZE) + self.iv = urandom(BLOCKSIZE) def test_single(self): pt = b"\x00" ct = cfb_encrypt(self.key, pt, mesh=True) dec = cfb_decrypt(self.key, ct, mesh=True) - self.assertEqual(pt, dec) + self.assertSequenceEqual(pt, dec) def test_short(self): pt = urandom(MESH_MAX_DATA - 1) ct = cfb_encrypt(self.key, pt, mesh=True) dec = cfb_decrypt(self.key, ct, mesh=True) dec_plain = cfb_decrypt(self.key, ct) - self.assertEqual(pt, dec) - self.assertEqual(pt, dec_plain) + self.assertSequenceEqual(pt, dec) + self.assertSequenceEqual(pt, dec_plain) def test_short_iv(self): pt = urandom(MESH_MAX_DATA - 1) ct = cfb_encrypt(self.key, pt, iv=self.iv, mesh=True) dec = cfb_decrypt(self.key, ct, iv=self.iv, mesh=True) dec_plain = cfb_decrypt(self.key, ct, iv=self.iv) - self.assertEqual(pt, dec) - self.assertEqual(pt, dec_plain) + self.assertSequenceEqual(pt, dec) + self.assertSequenceEqual(pt, dec_plain) def test_longer_iv(self): pt = urandom(MESH_MAX_DATA * 3) ct = cfb_encrypt(self.key, pt, iv=self.iv, mesh=True) dec = cfb_decrypt(self.key, ct, iv=self.iv, mesh=True) dec_plain = cfb_decrypt(self.key, ct, iv=self.iv) - self.assertEqual(pt, dec) + self.assertSequenceEqual(pt, dec) self.assertNotEqual(pt, dec_plain)