Ported openssl vector tests

This commit is contained in:
Alex Gaynor 2013-10-16 14:16:04 -07:00
parent bd458ae1e3
commit 016eed1cc1
6 changed files with 88 additions and 141 deletions

View file

@ -18,6 +18,7 @@ Tests using the CRYPTREC (Camellia) Test Vectors
from __future__ import absolute_import, division, print_function
import binascii
import os
from cryptography.primitives.block import ciphers, modes
@ -28,8 +29,7 @@ from ..utils import load_cryptrec_vectors_from_file
class TestCamelliaECB(object):
test_NTT = generate_encrypt_test(
load_cryptrec_vectors_from_file,
"Camellia",
"NTT",
os.path.join("Camellia", "NTT"),
["camellia-128-ecb", "camellia-192-ecb", "camellia-256"],
lambda key: ciphers.Camellia(binascii.unhexlify((key))),
lambda key: modes.EBC(),

View file

@ -18,6 +18,7 @@ Test using the NIST Test Vectors
from __future__ import absolute_import, division, print_function
import binascii
import os
from cryptography.primitives.block import ciphers, modes
@ -28,8 +29,7 @@ from ..utils import load_nist_vectors_from_file
class TestAES_CBC(object):
test_KAT = generate_encrypt_test(
lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
"AES",
"KAT",
os.path.join("AES", "KAT"),
[
"CBCGFSbox128.rsp",
"CBCGFSbox192.rsp",
@ -50,8 +50,7 @@ class TestAES_CBC(object):
test_MMT = generate_encrypt_test(
lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
"AES",
"MMT",
os.path.join("AES", "MMT"),
[
"CBCMMT128.rsp",
"CBCMMT192.rsp",
@ -65,8 +64,7 @@ class TestAES_CBC(object):
class TestAES_ECB(object):
test_KAT = generate_encrypt_test(
lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
"AES",
"KAT",
os.path.join("AES", "KAT"),
[
"ECBGFSbox128.rsp",
"ECBGFSbox192.rsp",
@ -87,8 +85,7 @@ class TestAES_ECB(object):
test_MMT = generate_encrypt_test(
lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
"AES",
"MMT",
os.path.join("AES", "MMT"),
[
"ECBMMT128.rsp",
"ECBMMT192.rsp",
@ -102,8 +99,7 @@ class TestAES_ECB(object):
class TestAES_OFB(object):
test_KAT = generate_encrypt_test(
lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
"AES",
"KAT",
os.path.join("AES", "KAT"),
[
"OFBGFSbox128.rsp",
"OFBGFSbox192.rsp",
@ -124,8 +120,7 @@ class TestAES_OFB(object):
test_MMT = generate_encrypt_test(
lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
"AES",
"MMT",
os.path.join("AES", "MMT"),
[
"OFBMMT128.rsp",
"OFBMMT192.rsp",
@ -139,8 +134,7 @@ class TestAES_OFB(object):
class TestAES_CFB(object):
test_KAT = generate_encrypt_test(
lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
"AES",
"KAT",
os.path.join("AES", "KAT"),
[
"CFB128GFSbox128.rsp",
"CFB128GFSbox192.rsp",
@ -162,8 +156,7 @@ class TestAES_CFB(object):
test_MMT = generate_encrypt_test(
lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
"AES",
"MMT",
os.path.join("AES", "MMT"),
[
"CFB128MMT128.rsp",
"CFB128MMT192.rsp",

View file

@ -23,78 +23,40 @@ import os
import pytest
from cryptography.primitives.block import BlockCipher, ciphers, modes
from cryptography.primitives.block import ciphers, modes
from .utils import generate_encrypt_test
from ..utils import load_openssl_vectors_from_file
def parameterize_encrypt_test(cipher, params, fnames):
return pytest.mark.parametrize(params,
list(itertools.chain.from_iterable(
load_openssl_vectors_from_file(os.path.join(cipher, fname))
for fname in fnames
))
)
class TestCamelliaCBC(object):
@parameterize_encrypt_test(
test_OpenSSL = generate_encrypt_test(
load_openssl_vectors_from_file,
"Camellia",
("key", "iv", "plaintext", "ciphertext"),
[
"camellia-cbc.txt",
]
["camellia-cbc.txt"],
lambda key, iv: ciphers.Camellia(binascii.unhexlify(key)),
lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
only_if=lambda api: api.supports_cipher("camellia-128-cbc")
)
def test_OpenSSL(self, key, iv, plaintext, ciphertext, api):
if not api.supports_cipher("camellia-128-cbc"):
pytest.skip("Does not support Camellia CBC") # pragma: no cover
cipher = BlockCipher(
ciphers.Camellia(binascii.unhexlify(key)),
modes.CBC(binascii.unhexlify(iv)),
)
actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
actual_ciphertext += cipher.finalize()
assert binascii.hexlify(actual_ciphertext).upper() == ciphertext
class TestCamelliaOFB(object):
@parameterize_encrypt_test(
test_OpenSSL = generate_encrypt_test(
load_openssl_vectors_from_file,
"Camellia",
("key", "iv", "plaintext", "ciphertext"),
[
"camellia-ofb.txt",
]
["camellia-ofb.txt"],
lambda key, iv: ciphers.Camellia(binascii.unhexlify(key)),
lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
only_if=lambda api: api.supports_cipher("camellia-128-ofb")
)
def test_OpenSSL(self, key, iv, plaintext, ciphertext, api):
if not api.supports_cipher("camellia-128-ofb"):
pytest.skip("Does not support Camellia OFB") # pragma: no cover
cipher = BlockCipher(
ciphers.Camellia(binascii.unhexlify(key)),
modes.OFB(binascii.unhexlify(iv)),
)
actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
actual_ciphertext += cipher.finalize()
assert binascii.hexlify(actual_ciphertext).upper() == ciphertext
class TestCamelliaCFB(object):
@parameterize_encrypt_test(
test_OpenSSL = generate_encrypt_test(
load_openssl_vectors_from_file,
"Camellia",
("key", "iv", "plaintext", "ciphertext"),
[
"camellia-cfb.txt",
]
["camellia-cfb.txt"],
lambda key, iv: ciphers.Camellia(binascii.unhexlify(key)),
lambda key, iv: modes.CFB(binascii.unhexlify(iv)),
only_if=lambda api: api.supports_cipher("camellia-128-cfb")
)
def test_OpenSSL(self, key, iv, plaintext, ciphertext, api):
if not api.supports_cipher("camellia-128-cfb"):
pytest.skip("Does not support Camellia CFB") # pragma: no cover
cipher = BlockCipher(
ciphers.Camellia(binascii.unhexlify(key)),
modes.CFB(binascii.unhexlify(iv)),
)
actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
actual_ciphertext += cipher.finalize()
assert binascii.hexlify(actual_ciphertext).upper() == ciphertext

View file

@ -7,18 +7,15 @@ from cryptography.bindings import openssl
from cryptography.primitives.block import BlockCipher
def generate_encrypt_test(param_loader, cipher_name, vector_type, file_names,
cipher_factory, mode_factory,
only_if=lambda api: True):
def generate_encrypt_test(param_loader, path, file_names, cipher_factory,
mode_factory, only_if=lambda api: True):
def test_encryption(self):
for api in [openssl.api]:
if not only_if(api):
yield encrypt_skipped
else:
for file_name in file_names:
for params in param_loader(
os.path.join(cipher_name, vector_type, file_name)
):
for params in param_loader(os.path.join(path, file_name)):
yield encrypt_test, api, cipher_factory, mode_factory, params
return test_encryption

View file

@ -304,30 +304,30 @@ def test_load_openssl_vectors():
).splitlines()
assert load_openssl_vectors(vector_data) == [
(
b"2B7E151628AED2A6ABF7158809CF4F3C",
b"000102030405060708090A0B0C0D0E0F",
b"6BC1BEE22E409F96E93D7E117393172A",
b"14F7646187817EB586599146B82BD719",
),
(
b"2B7E151628AED2A6ABF7158809CF4F3C",
b"14F7646187817EB586599146B82BD719",
b"AE2D8A571E03AC9C9EB76FAC45AF8E51",
b"A53D28BB82DF741103EA4F921A44880B",
),
(
b"2B7E151628AED2A6ABF7158809CF4F3C",
b"000102030405060708090A0B0C0D0E0F",
b"6BC1BEE22E409F96E93D7E117393172A",
b"14F7646187817EB586599146B82BD719",
),
(
b"2B7E151628AED2A6ABF7158809CF4F3C",
b"14F7646187817EB586599146B82BD719",
b"AE2D8A571E03AC9C9EB76FAC45AF8E51",
b"A53D28BB82DF741103EA4F921A44880B",
),
{
"key": b"2B7E151628AED2A6ABF7158809CF4F3C",
"iv": b"000102030405060708090A0B0C0D0E0F",
"plaintext": b"6BC1BEE22E409F96E93D7E117393172A",
"ciphertext": b"14F7646187817EB586599146B82BD719",
},
{
"key": b"2B7E151628AED2A6ABF7158809CF4F3C",
"iv": b"14F7646187817EB586599146B82BD719",
"plaintext": b"AE2D8A571E03AC9C9EB76FAC45AF8E51",
"ciphertext": b"A53D28BB82DF741103EA4F921A44880B",
},
{
"key": b"2B7E151628AED2A6ABF7158809CF4F3C",
"iv": b"000102030405060708090A0B0C0D0E0F",
"plaintext": b"6BC1BEE22E409F96E93D7E117393172A",
"ciphertext": b"14F7646187817EB586599146B82BD719",
},
{
"key": b"2B7E151628AED2A6ABF7158809CF4F3C",
"iv": b"14F7646187817EB586599146B82BD719",
"plaintext": b"AE2D8A571E03AC9C9EB76FAC45AF8E51",
"ciphertext": b"A53D28BB82DF741103EA4F921A44880B",
},
]
@ -335,28 +335,28 @@ def test_load_openssl_vectors_from_file():
test_list = load_openssl_vectors_from_file("Camellia/camellia-ofb.txt")
assert len(test_list) == 24
assert test_list[:4] == [
(
b"2B7E151628AED2A6ABF7158809CF4F3C",
b"000102030405060708090A0B0C0D0E0F",
b"6BC1BEE22E409F96E93D7E117393172A",
b"14F7646187817EB586599146B82BD719",
),
(
b"2B7E151628AED2A6ABF7158809CF4F3C",
b"50FE67CC996D32B6DA0937E99BAFEC60",
b"AE2D8A571E03AC9C9EB76FAC45AF8E51",
b"25623DB569CA51E01482649977E28D84",
),
(
b"2B7E151628AED2A6ABF7158809CF4F3C",
b"D9A4DADA0892239F6B8B3D7680E15674",
b"30C81C46A35CE411E5FBC1191A0A52EF",
b"C776634A60729DC657D12B9FCA801E98",
),
(
b"2B7E151628AED2A6ABF7158809CF4F3C",
b"A78819583F0308E7A6BF36B1386ABF23",
b"F69F2445DF4F9B17AD2B417BE66C3710",
b"D776379BE0E50825E681DA1A4C980E8E",
),
{
"key": b"2B7E151628AED2A6ABF7158809CF4F3C",
"iv": b"000102030405060708090A0B0C0D0E0F",
"plaintext": b"6BC1BEE22E409F96E93D7E117393172A",
"ciphertext": b"14F7646187817EB586599146B82BD719",
},
{
"key": b"2B7E151628AED2A6ABF7158809CF4F3C",
"iv": b"50FE67CC996D32B6DA0937E99BAFEC60",
"plaintext": b"AE2D8A571E03AC9C9EB76FAC45AF8E51",
"ciphertext": b"25623DB569CA51E01482649977E28D84",
},
{
"key": b"2B7E151628AED2A6ABF7158809CF4F3C",
"iv": b"D9A4DADA0892239F6B8B3D7680E15674",
"plaintext": b"30C81C46A35CE411E5FBC1191A0A52EF",
"ciphertext": b"C776634A60729DC657D12B9FCA801E98",
},
{
"key": b"2B7E151628AED2A6ABF7158809CF4F3C",
"iv": b"A78819583F0308E7A6BF36B1386ABF23",
"plaintext": b"F69F2445DF4F9B17AD2B417BE66C3710",
"ciphertext": b"D776379BE0E50825E681DA1A4C980E8E",
},
]

View file

@ -112,15 +112,10 @@ def load_openssl_vectors(vector_data):
continue
vector = line.split(":")
params = (
# key
vector[1].encode("ascii"),
# iv
vector[2].encode("ascii"),
# plaintext
vector[3].encode("ascii"),
# ciphertext
vector[4].encode("ascii")
)
vectors.append(params)
vectors.append({
"key": vector[1].encode("ascii"),
"iv": vector[2].encode("ascii"),
"plaintext": vector[3].encode("ascii"),
"ciphertext": vector[4].encode("ascii"),
})
return vectors