File diff 52d85e47faa0 → de1cc2505a56
tests/test_crypto.py
Show inline comments
 
@@ -108,7 +108,7 @@ def test_generate_ca_hierarchy_returns_list_with_3_elements_for_depth_3():
 
    base_name = 'My Project'
 
    depth = 3
 

	
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    assert isinstance(hierarchy, list)
 
    assert len(hierarchy) == depth
 
@@ -118,7 +118,7 @@ def test_generate_ca_hierarchy_returns_list_with_1_element_for_depth_1():
 
    base_name = 'My Project'
 
    depth = 1
 

	
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    assert isinstance(hierarchy, list)
 
    assert len(hierarchy) == depth
 
@@ -128,7 +128,7 @@ def test_generate_ca_hierarchy_returns_list_of_private_key_certificate_pairs():
 
    base_name = 'My Project'
 
    depth = 3
 

	
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    for private_key, certificate in hierarchy:
 
        assert isinstance(private_key, cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey)
 
@@ -138,7 +138,7 @@ def test_generate_ca_hierarchy_returns_list_of_private_key_certificate_pairs():
 
def test_generate_ca_hierarchy_subject_dns_have_correct_value():
 
    base_name = 'My Project'
 
    depth = 3
 
    key_generator = gimmecert.crypto.KeyGenerator("rsa:2048")
 
    key_generator = gimmecert.crypto.KeyGenerator("rsa", 2048)
 

	
 
    level1, level2, level3 = [certificate for _, certificate in gimmecert.crypto.generate_ca_hierarchy(base_name, depth, key_generator)]
 

	
 
@@ -151,7 +151,7 @@ def test_generate_ca_hierarchy_issuer_dns_have_correct_value():
 
    base_name = 'My Project'
 
    depth = 3
 

	
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    level1_key, level1_certificate = hierarchy[0]
 
    level2_key, level2_certificate = hierarchy[1]
 
@@ -166,7 +166,7 @@ def test_generate_ca_hierarchy_private_keys_match_with_public_keys_in_certificat
 
    base_name = 'My Project'
 
    depth = 3
 

	
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    level1_private_key, level1_certificate = hierarchy[0]
 
    level2_private_key, level2_certificate = hierarchy[1]
 
@@ -181,7 +181,7 @@ def test_generate_ca_hierarchy_cas_have_differing_keys():
 
    base_name = 'My Project'
 
    depth = 3
 

	
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    level1_private_key, _ = hierarchy[0]
 
    level2_private_key, _ = hierarchy[1]
 
@@ -200,7 +200,7 @@ def test_generate_ca_hierarchy_certificates_have_same_validity():
 
    base_name = 'My Project'
 
    depth = 3
 

	
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    _, level1_certificate = hierarchy[0]
 
    _, level2_certificate = hierarchy[1]
 
@@ -250,7 +250,7 @@ def test_generate_ca_hierarchy_produces_certificates_with_ca_basic_constraints()
 
    base_name = 'My test'
 
    depth = 3
 

	
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    hierarchy = gimmecert.crypto.generate_ca_hierarchy(base_name, depth, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    for _, certificate in hierarchy:
 
        stored_extension = certificate.extensions.get_extension_for_class(cryptography.x509.BasicConstraints)
 
@@ -263,7 +263,7 @@ def test_generate_ca_hierarchy_produces_certificates_with_ca_basic_constraints()
 

	
 

	
 
def test_issue_server_certificate_returns_certificate():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -274,7 +274,7 @@ def test_issue_server_certificate_returns_certificate():
 

	
 

	
 
def test_issue_server_certificate_sets_correct_extensions():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -319,7 +319,7 @@ def test_issue_server_certificate_sets_correct_extensions():
 

	
 

	
 
def test_issue_server_certificate_has_correct_issuer_and_subject():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 4, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 4, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[3]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -331,7 +331,7 @@ def test_issue_server_certificate_has_correct_issuer_and_subject():
 

	
 

	
 
def test_issue_server_certificate_has_correct_public_key():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -343,7 +343,7 @@ def test_issue_server_certificate_has_correct_public_key():
 

	
 
@freeze_time('2018-01-01 00:15:00')
 
def test_issue_server_certificate_not_before_is_15_minutes_in_past():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -355,7 +355,7 @@ def test_issue_server_certificate_not_before_is_15_minutes_in_past():
 

	
 
def test_issue_server_certificate_not_before_does_not_exceed_ca_validity():
 
    with freeze_time('2018-01-01 00:15:00'):
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
@@ -369,7 +369,7 @@ def test_issue_server_certificate_not_before_does_not_exceed_ca_validity():
 

	
 
def test_issue_server_certificate_not_after_does_not_exceed_ca_validity():
 
    with freeze_time('2018-01-01 00:15:00'):
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
@@ -382,7 +382,7 @@ def test_issue_server_certificate_not_after_does_not_exceed_ca_validity():
 

	
 

	
 
def test_issue_server_certificate_incorporates_additional_dns_subject_alternative_names():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -403,7 +403,7 @@ def test_issue_server_certificate_incorporates_additional_dns_subject_alternativ
 

	
 

	
 
def test_issue_client_certificate_returns_certificate():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -414,7 +414,7 @@ def test_issue_client_certificate_returns_certificate():
 

	
 

	
 
def test_issue_client_certificate_has_correct_issuer_and_subject():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 4, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 4, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[3]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -426,7 +426,7 @@ def test_issue_client_certificate_has_correct_issuer_and_subject():
 

	
 

	
 
def test_issue_client_certificate_sets_correct_extensions():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -463,7 +463,7 @@ def test_issue_client_certificate_sets_correct_extensions():
 

	
 

	
 
def test_issue_client_certificate_has_correct_public_key():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -475,7 +475,7 @@ def test_issue_client_certificate_has_correct_public_key():
 

	
 
@freeze_time('2018-01-01 00:15:00')
 
def test_issue_client_certificate_not_before_is_15_minutes_in_past():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -487,7 +487,7 @@ def test_issue_client_certificate_not_before_is_15_minutes_in_past():
 

	
 
def test_issue_client_certificate_not_before_does_not_exceed_ca_validity():
 
    with freeze_time('2018-01-01 00:15:00'):
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
@@ -501,7 +501,7 @@ def test_issue_client_certificate_not_before_does_not_exceed_ca_validity():
 

	
 
def test_issue_client_certificate_not_after_does_not_exceed_ca_validity():
 
    with freeze_time('2018-01-01 00:15:00'):
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 

	
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
@@ -514,7 +514,7 @@ def test_issue_client_certificate_not_after_does_not_exceed_ca_validity():
 

	
 

	
 
def test_renew_certificate_returns_certificate():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -526,7 +526,7 @@ def test_renew_certificate_returns_certificate():
 

	
 

	
 
def test_renew_certificate_has_correct_content():
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
    ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
    issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
    private_key = gimmecert.crypto.generate_private_key()
 
@@ -546,7 +546,7 @@ def test_renew_certificate_not_before_is_15_minutes_in_past():
 

	
 
    # Initial server certificate.
 
    with freeze_time('2018-01-01 00:15:00'):
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
        issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
        private_key = gimmecert.crypto.generate_private_key()
 
@@ -563,7 +563,7 @@ def test_renew_certificate_not_before_does_not_exceed_ca_validity():
 

	
 
    # Initial server certificate.
 
    with freeze_time('2018-01-01 00:15:00'):
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
        issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
        private_key = gimmecert.crypto.generate_private_key()
 
@@ -580,7 +580,7 @@ def test_renew_certificate_not_after_does_not_exceed_ca_validity():
 

	
 
    # Initial server certificate.
 
    with freeze_time('2018-01-01 00:15:00'):
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa:2048"))
 
        ca_hierarchy = gimmecert.crypto.generate_ca_hierarchy('My Project', 1, gimmecert.crypto.KeyGenerator("rsa", 2048))
 
        issuer_private_key, issuer_certificate = ca_hierarchy[0]
 

	
 
        private_key = gimmecert.crypto.generate_private_key()
 
@@ -618,67 +618,31 @@ def test_generate_csr_returns_csr_with_passed_in_name():
 
    assert csr.subject == expected_subject_dn
 

	
 

	
 
@pytest.mark.parametrize("key_specification", [
 
    "",
 
    "rsa",
 
    "rsa:not_a_number",
 
    "unsupported:algorithm",
 
@pytest.mark.parametrize("algorithm, parameters, string_representation", [
 
    ("rsa", 1024, "1024-bit RSA"),
 
    ("rsa", 2048, "2048-bit RSA"),
 
    ("rsa", 4096, "4096-bit RSA"),
 
])
 
def test_KeyGenerator_raises_exception_for_invalid_specification(key_specification):
 
def test_KeyGenerator_string_representation(algorithm, parameters, string_representation):
 

	
 
    with pytest.raises(ValueError) as e_info:
 
        gimmecert.crypto.KeyGenerator(key_specification)
 

	
 
    assert str(e_info.value) == "Invalid key specification: '%s'" % key_specification
 

	
 

	
 
@pytest.mark.parametrize("key_specification", [
 
    "rsa:1024",
 
    "rsa:2048",
 
    "rsa:4096",
 
])
 
def test_KeyGenerator_accepts_valid_specifications(key_specification):
 

	
 
    gimmecert.crypto.KeyGenerator(key_specification)  # should not raise
 

	
 

	
 
def test_KeyGenerator_stores_specification():
 

	
 
    key_generator = gimmecert.crypto.KeyGenerator("rsa:2048")
 

	
 
    assert key_generator._algorithm == "rsa"
 
    assert key_generator._parameters == 2048
 

	
 

	
 
@pytest.mark.parametrize("key_specification, string_representation", [
 
    ("rsa:1024", "1024-bit RSA"),
 
    ("rsa:2048", "2048-bit RSA"),
 
    ("rsa:4096", "4096-bit RSA"),
 
])
 
def test_KeyGenerator_string_representation(key_specification, string_representation):
 

	
 
    key_generator = gimmecert.crypto.KeyGenerator(key_specification)
 
    key_generator = gimmecert.crypto.KeyGenerator(algorithm, parameters)
 
    assert str(key_generator) == string_representation
 

	
 

	
 
def test_KeyGenerator_instance_returns_rsa_private_key():
 

	
 
    key_generator_1 = gimmecert.crypto.KeyGenerator("rsa:1024")
 
    key_generator_2 = gimmecert.crypto.KeyGenerator("rsa:2048")
 
@pytest.mark.parametrize("key_size", [1024, 2048, 4096])
 
def test_KeyGenerator_instance_returns_rsa_private_key_of_correct_size(key_size):
 

	
 
    private_key_1 = key_generator_1()
 
    private_key_2 = key_generator_2()
 
    key_generator = gimmecert.crypto.KeyGenerator("rsa", key_size)
 

	
 
    assert isinstance(private_key_1, cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey)
 
    assert isinstance(private_key_2, cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey)
 
    private_key = key_generator()
 

	
 
    assert private_key_1.key_size == 1024
 
    assert private_key_2.key_size == 2048
 
    assert isinstance(private_key, cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey)
 
    assert private_key.key_size == key_size
 

	
 

	
 
@pytest.mark.parametrize("key_generator, expected_bit_size", [
 
    (gimmecert.crypto.KeyGenerator("rsa:1024"), 1024),
 
    (gimmecert.crypto.KeyGenerator("rsa:2048"), 2048),
 
    (gimmecert.crypto.KeyGenerator("rsa", 1024), 1024),
 
    (gimmecert.crypto.KeyGenerator("rsa", 2048), 2048),
 
])
 
def test_generate_ca_hierarchy_uses_correct_rsa_bit_size(key_generator, expected_bit_size):
 
    base_name = "My Test"