From f4b12883579af918653904d3f1351d9a454d5e6f Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Mon, 16 Nov 2009 20:52:55 +0000 Subject: Implement testing of DH key pair generation --- src/key.c | 409 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 213 insertions(+), 196 deletions(-) (limited to 'src/key.c') diff --git a/src/key.c b/src/key.c index 0f6aa38..a305215 100644 --- a/src/key.c +++ b/src/key.c @@ -14,17 +14,21 @@ test_key_attributes(CK_SLOT_ID slot, CK_SESSION_HANDLE session, CK_OBJECT_HANDLE CK_MECHANISM_TYPE_PTR mechanisms; CK_ULONG n_mechanisms, i; CK_BBOOL bval, local; + CK_KEY_TYPE ktype; CK_DATE date; CK_RV rv; P11T_SECTION("Key Object"); attr.type = CKA_KEY_TYPE; - attr.ulValueLen = sizeof(*key_type); - attr.pValue = key_type; + attr.ulValueLen = sizeof(ktype); + attr.pValue = &ktype; rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); P11T_CHECK_RV("CKA_KEY_TYPE", rv, CKR_OK); + if (key_type) + *key_type = ktype; + attr.type = CKA_ID; attr.ulValueLen = sizeof(buffer); attr.pValue = buffer; @@ -74,7 +78,7 @@ test_key_attributes(CK_SLOT_ID slot, CK_SESSION_HANDLE session, CK_OBJECT_HANDLE { if(!local) P11T_CHECK_FAIL_MSG("CKA_KEY_GEN_MECHANISM", "Non locally generated key has key gen mechanism"); - if(!p11t_slot_get_mech_info(slot, mech_type)) + if(slot && !p11t_slot_get_mech_info(slot, mech_type)) P11T_CHECK_FAIL_MSG("CKA_KEY_GEN_MECHANISM", "Mechanism not present on slot"); } @@ -91,7 +95,7 @@ test_key_attributes(CK_SLOT_ID slot, CK_SESSION_HANDLE session, CK_OBJECT_HANDLE n_mechanisms = attr.ulValueLen / sizeof(CK_MECHANISM_TYPE); for(i = 0; i < n_mechanisms; ++i) { - if(!p11t_slot_get_mech_info(slot, mechanisms[i])) + if(slot && !p11t_slot_get_mech_info(slot, mechanisms[i])) P11T_CHECK_FAIL_MSG("CKA_ALLOWED_MECHANISMS", "Mechanism not present in slot"); } } @@ -99,6 +103,168 @@ test_key_attributes(CK_SLOT_ID slot, CK_SESSION_HANDLE session, CK_OBJECT_HANDLE return CONTINUE; } +static int +test_public_attributes(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object) +{ + CK_BYTE buffer[4096]; + CK_ATTRIBUTE attr; + CK_BBOOL bval, wrap; + const char *msg; + CK_RV rv; + + P11T_SECTION("CKO_PUBLIC_KEY"); + + attr.type = CKA_SUBJECT; + attr.pValue = buffer; + attr.ulValueLen = sizeof(buffer); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_SUBJECT", rv, CKR_OK); + + if(attr.ulValueLen) + { + msg = p11t_certificate_validate_dn(attr.pValue, attr.ulValueLen); + if(msg != NULL) + P11T_CHECK_FAIL_MSG("CKA_SUBJECT", msg); + } + + attr.type = CKA_ENCRYPT; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_ENCRYPT", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_ENCRYPT", bval); + + attr.type = CKA_VERIFY; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_VERIFY", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_VERIFY", bval); + + attr.type = CKA_VERIFY_RECOVER; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_VERIFY_RECOVER", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_VERIFY_RECOVER", bval); + + attr.type = CKA_TRUSTED; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_TRUSTED", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_TRUSTED", bval); + + attr.type = CKA_WRAP; + attr.pValue = &wrap; + attr.ulValueLen = sizeof(wrap); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_WRAP", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_WRAP", wrap); + + return CONTINUE; +} + +static int +test_private_attributes(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object) +{ + CK_BYTE buffer[4096]; + CK_ATTRIBUTE attr; + CK_BBOOL bval; + const char *msg; + CK_RV rv; + + P11T_SECTION("CKO_PRIVATE_KEY"); + + attr.type = CKA_SUBJECT; + attr.pValue = buffer; + attr.ulValueLen = sizeof(buffer); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_SUBJECT", rv, CKR_OK); + + if(attr.ulValueLen) + { + msg = p11t_certificate_validate_dn(attr.pValue, attr.ulValueLen); + if(msg != NULL) + P11T_CHECK_FAIL_MSG("CKA_SUBJECT", msg); + } + + attr.type = CKA_SENSITIVE; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_SENSITIVE", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_SENSITIVE", bval); + + attr.type = CKA_DECRYPT; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_DECRYPT", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_DECRYPT", bval); + + attr.type = CKA_SIGN; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_SIGN", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_SIGN", bval); + + attr.type = CKA_SIGN_RECOVER; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_SIGN_RECOVER", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_SIGN_RECOVER", bval); + + attr.type = CKA_UNWRAP; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_UNWRAP", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_UNWRAP", bval); + + attr.type = CKA_EXTRACTABLE; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_EXTRACTABLE", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_EXTRACTABLE", bval); + + attr.type = CKA_ALWAYS_SENSITIVE; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_ALWAYS_SENSITIVE", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_ALWAYS_SENSITIVE", bval); + + attr.type = CKA_NEVER_EXTRACTABLE; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_NEVER_EXTRACTABLE", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_NEVER_EXTRACTABLE", bval); + + if(p11t_test_unexpected) + { + attr.type = CKA_WRAP_WITH_TRUSTED; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_WRAP_WITH_TRUSTED", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_WRAP_WITH_TRUSTED", bval); + + attr.type = CKA_ALWAYS_AUTHENTICATE; + attr.pValue = &bval; + attr.ulValueLen = sizeof(bval); + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); + P11T_CHECK_RV("CKA_ALWAYS_AUTHENTICATE", rv, CKR_OK); + P11T_CHECK_BOOL("CKA_ALWAYS_AUTHENTICATE", bval); + } + + return CONTINUE; +} + static int test_rsa_public(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object) { @@ -591,8 +757,7 @@ test_rsa_public_create(CK_SESSION_HANDLE session, CK_BBOOL token, RSA *rsa, CK_O return CONTINUE; P11T_CHECK_RV("RSA Public Key", rv, CKR_OK); - test_rsa_public (session, object); - + p11t_key_test (session, object, CKO_PUBLIC_KEY); *result = object; return CONTINUE; } @@ -655,8 +820,7 @@ test_rsa_private_create(CK_SESSION_HANDLE session, CK_BBOOL token, RSA *rsa, CK_ return STOP; P11T_CHECK_RV("RSA Private Key", rv, CKR_OK); - test_rsa_private (session, object); - + p11t_key_test (session, object, CKO_PRIVATE_KEY); *result = object; return CONTINUE; } @@ -746,8 +910,7 @@ test_dsa_public_create(CK_SESSION_HANDLE session, CK_BBOOL token, DSA *dsa, CK_O return CONTINUE; P11T_CHECK_RV("DSA Public Key", rv, CKR_OK); - test_dsa_public (session, object); - + p11t_key_test (session, object, CKO_PUBLIC_KEY); *result = object; return CONTINUE; } @@ -805,8 +968,7 @@ test_dsa_private_create(CK_SESSION_HANDLE session, CK_BBOOL token, DSA *dsa, CK_ return CONTINUE; P11T_CHECK_RV("DSA Private Key", rv, CKR_OK); - test_dsa_private (session, object); - + p11t_key_test (session, object, CKO_PRIVATE_KEY); *result = object; return CONTINUE; } @@ -859,8 +1021,7 @@ test_dh_public_create(CK_SESSION_HANDLE session, CK_BBOOL token, DH *dh, CK_OBJE return CONTINUE; P11T_CHECK_RV("DH Public Key", rv, CKR_OK); - test_dh_public (session, object); - + p11t_key_test (session, object, CKO_PUBLIC_KEY); *result = object; return CONTINUE; } @@ -913,8 +1074,7 @@ test_dh_private_create(CK_SESSION_HANDLE session, CK_BBOOL token, DH *dh, CK_OBJ return CONTINUE; P11T_CHECK_RV("DH Private Key", rv, CKR_OK); - test_dh_private (session, object); - + p11t_key_test (session, object, CKO_PRIVATE_KEY); *result = object; return CONTINUE; } @@ -1017,163 +1177,46 @@ test_create_unexpected(CK_SESSION_HANDLE session) return CONTINUE; } -static int -test_public_attributes(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object) +int +p11t_key_test (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object, CK_OBJECT_CLASS klass) { - CK_BYTE buffer[4096]; + CK_OBJECT_CLASS key_class; CK_ATTRIBUTE attr; - CK_BBOOL bval, wrap; - const char *msg; - CK_RV rv; - - P11T_SECTION("CKO_PUBLIC_KEY"); - - attr.type = CKA_SUBJECT; - attr.pValue = buffer; - attr.ulValueLen = sizeof(buffer); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_SUBJECT", rv, CKR_OK); - - if(attr.ulValueLen) - { - msg = p11t_certificate_validate_dn(attr.pValue, attr.ulValueLen); - if(msg != NULL) - P11T_CHECK_FAIL_MSG("CKA_SUBJECT", msg); - } - - attr.type = CKA_ENCRYPT; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_ENCRYPT", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_ENCRYPT", bval); - - attr.type = CKA_VERIFY; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_VERIFY", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_VERIFY", bval); - - attr.type = CKA_VERIFY_RECOVER; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_VERIFY_RECOVER", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_VERIFY_RECOVER", bval); - - attr.type = CKA_TRUSTED; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_TRUSTED", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_TRUSTED", bval); - - attr.type = CKA_WRAP; - attr.pValue = &wrap; - attr.ulValueLen = sizeof(wrap); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_WRAP", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_WRAP", wrap); - - return CONTINUE; -} - -static int -test_private_attributes(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object) -{ - CK_BYTE buffer[4096]; - CK_ATTRIBUTE attr; - CK_BBOOL bval; - const char *msg; + CK_SESSION_INFO info; + CK_KEY_TYPE key_type; CK_RV rv; - P11T_SECTION("CKO_PRIVATE_KEY"); - - attr.type = CKA_SUBJECT; - attr.pValue = buffer; - attr.ulValueLen = sizeof(buffer); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_SUBJECT", rv, CKR_OK); - - if(attr.ulValueLen) - { - msg = p11t_certificate_validate_dn(attr.pValue, attr.ulValueLen); - if(msg != NULL) - P11T_CHECK_FAIL_MSG("CKA_SUBJECT", msg); - } - - attr.type = CKA_SENSITIVE; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_SENSITIVE", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_SENSITIVE", bval); - - attr.type = CKA_DECRYPT; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_DECRYPT", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_DECRYPT", bval); - - attr.type = CKA_SIGN; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_SIGN", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_SIGN", bval); - - attr.type = CKA_SIGN_RECOVER; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_SIGN_RECOVER", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_SIGN_RECOVER", bval); - - attr.type = CKA_UNWRAP; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_UNWRAP", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_UNWRAP", bval); - - attr.type = CKA_EXTRACTABLE; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_EXTRACTABLE", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_EXTRACTABLE", bval); - - attr.type = CKA_ALWAYS_SENSITIVE; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_ALWAYS_SENSITIVE", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_ALWAYS_SENSITIVE", bval); - - attr.type = CKA_NEVER_EXTRACTABLE; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_NEVER_EXTRACTABLE", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_NEVER_EXTRACTABLE", bval); - - if(p11t_test_unexpected) - { - attr.type = CKA_WRAP_WITH_TRUSTED; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_WRAP_WITH_TRUSTED", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_WRAP_WITH_TRUSTED", bval); + P11T_SECTION ("Key Object"); + attr.type = CKA_CLASS; + attr.ulValueLen = sizeof (key_class); + attr.pValue = &key_class; + rv = (p11t_module_funcs->C_GetAttributeValue) (session, object, &attr, 1); + P11T_CHECK_RV ("CKA_CLASS", rv, CKR_OK); + if (klass && klass != key_class) + P11T_CHECK_FAIL_MSG ("CKA_CLASS", "Key class is not as expected"); - attr.type = CKA_ALWAYS_AUTHENTICATE; - attr.pValue = &bval; - attr.ulValueLen = sizeof(bval); - rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, &attr, 1); - P11T_CHECK_RV("CKA_ALWAYS_AUTHENTICATE", rv, CKR_OK); - P11T_CHECK_BOOL("CKA_ALWAYS_AUTHENTICATE", bval); + rv = (p11t_module_funcs->C_GetSessionInfo) (session, &info); + if (rv != CKR_OK) + info.slotID = 0; + + if (test_key_attributes (info.slotID, session, object, &key_type)) { + if (key_class == CKO_PRIVATE_KEY) { + test_private_attributes (session, object); + if (key_type == CKK_RSA) + test_rsa_private (session, object); + else if (key_type == CKK_DSA) + test_dsa_private (session, object); + else if (key_type == CKK_DH) + test_dh_private (session, object); + } else if (key_class == CKO_PUBLIC_KEY) { + test_public_attributes (session, object); + if (key_type == CKK_RSA) + test_rsa_public (session, object); + else if (key_type == CKK_DSA) + test_dsa_public (session, object); + else if (key_type == CKK_DH) + test_dh_public (session, object); + } } return CONTINUE; @@ -1185,11 +1228,9 @@ p11t_key_tests(void) CK_OBJECT_CLASS klass; CK_OBJECT_HANDLE_PTR objects; CK_SESSION_HANDLE session; - CK_OBJECT_HANDLE object; CK_ATTRIBUTE attrs[1]; CK_ULONG j, i, n_objects; CK_SLOT_ID slot; - CK_KEY_TYPE key_type; attrs[0].type = CKA_CLASS; attrs[0].ulValueLen = sizeof(klass); @@ -1206,19 +1247,7 @@ p11t_key_tests(void) objects = p11t_object_find(session, attrs, 1, &n_objects); for(i = 0; objects && i < n_objects; ++i) - { - object = objects[i]; - if(test_key_attributes(slot, session, object, &key_type)) - { - test_public_attributes(session, object); - if(key_type == CKK_RSA) - test_rsa_public(session, object); - else if(key_type == CKK_DSA) - test_dsa_public(session, object); - else if(key_type == CKK_DH) - test_dh_public(session, object); - } - } + p11t_key_test (session, objects[i], klass); if(p11t_test_write_session) test_create_unexpected(session); @@ -1231,19 +1260,7 @@ p11t_key_tests(void) objects = p11t_object_find(session, attrs, 1, &n_objects); for(i = 0; objects && i < n_objects; ++i) - { - object = objects[i]; - if(test_key_attributes(slot, session, object, &key_type)) - { - test_private_attributes(session, object); - if(key_type == CKK_RSA) - test_rsa_private(session, object); - else if(key_type == CKK_DSA) - test_dsa_private(session, object); - else if (key_type == CKK_DH) - test_dh_private (session, object); - } - } + p11t_key_test (session, objects[i], klass); free(objects); if (p11t_test_write_session) { -- cgit v1.2.3