diff options
Diffstat (limited to 'usr/src/lib/libkmf/libkmf/common/pk11keys.c')
-rw-r--r-- | usr/src/lib/libkmf/libkmf/common/pk11keys.c | 234 |
1 files changed, 90 insertions, 144 deletions
diff --git a/usr/src/lib/libkmf/libkmf/common/pk11keys.c b/usr/src/lib/libkmf/libkmf/common/pk11keys.c index 66d328968b..5a6e945009 100644 --- a/usr/src/lib/libkmf/libkmf/common/pk11keys.c +++ b/usr/src/lib/libkmf/libkmf/common/pk11keys.c @@ -61,7 +61,7 @@ create_pk11_session(CK_SESSION_HANDLE *sessionp, CK_MECHANISM_TYPE wanted_mech, } if (i < pulCount) { rv = C_OpenSession(pSlotList[i], CKF_SERIAL_SESSION, - NULL, NULL, sessionp); + NULL, NULL, sessionp); if (rv != CKR_OK) { kmf_rv = KMF_ERR_UNINITIALIZED; @@ -148,8 +148,10 @@ PKCS_CreatePublicKey( /* Parse the keyblob */ (void) memset(KeyParts, 0, sizeof (KeyParts)); - AlgorithmId = X509_AlgorithmOidToAlgId((KMF_OID *) - &pKey->algorithm.algorithm); + AlgorithmId = x509_algoid_to_algid( + (KMF_OID *)&pKey->algorithm.algorithm); + if (AlgorithmId == KMF_ALGID_NONE) + return (KMF_ERR_BAD_ALGORITHM); mrReturn = ExtractSPKIData(pKey, AlgorithmId, KeyParts, &uNumKeyParts); @@ -157,74 +159,46 @@ PKCS_CreatePublicKey( return (mrReturn); /* Fill in the common object attributes */ - if (!PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_CLASS, - (CK_BYTE *)&ckObjClass, - sizeof (ckObjClass)) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_TOKEN, - (CK_BYTE *)&ckToken, - sizeof (ckToken)) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_PRIVATE, - (CK_BYTE *)&ckPrivate, - sizeof (ckPrivate))) { + if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_CLASS, (CK_BYTE *)&ckObjClass, + sizeof (ckObjClass)) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_TOKEN, (CK_BYTE *)&ckToken, + sizeof (ckToken)) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_PRIVATE, (CK_BYTE *)&ckPrivate, + sizeof (ckPrivate))) { mrReturn = KMF_ERR_INTERNAL; goto cleanup; } /* Fill in the common key attributes */ - if (!PKCS_ConvertAlgorithmId2PKCSKeyType(AlgorithmId, - &ckKeyType)) { + if (!pkcs_algid_to_keytype(AlgorithmId, &ckKeyType)) { goto cleanup; } - if (!PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_KEY_TYPE, - (CK_BYTE *)&ckKeyType, - sizeof (ckKeyType)) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_DERIVE, - (CK_BYTE *)&ckDerive, - sizeof (ckDerive))) { + if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_KEY_TYPE, (CK_BYTE *)&ckKeyType, + sizeof (ckKeyType)) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_DERIVE, (CK_BYTE *)&ckDerive, + sizeof (ckDerive))) { mrReturn = KMF_ERR_INTERNAL; goto cleanup; } /* Add common public key attributes */ - if (!PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_ENCRYPT, - (CK_BYTE *)&ckEncrypt, - sizeof (ckEncrypt)) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_VERIFY, - (CK_BYTE *)&ckVerify, - sizeof (ckVerify)) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_VERIFY_RECOVER, - (CK_BYTE *)&ckVerifyRecover, - sizeof (ckVerifyRecover)) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_WRAP, - (CK_BYTE *)&ckWrap, - sizeof (ckWrap))) { + if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_ENCRYPT, (CK_BYTE *)&ckEncrypt, + sizeof (ckEncrypt)) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_VERIFY, (CK_BYTE *)&ckVerify, + sizeof (ckVerify)) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_VERIFY_RECOVER, + (CK_BYTE *)&ckVerifyRecover, sizeof (ckVerifyRecover)) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_WRAP, (CK_BYTE *)&ckWrap, + sizeof (ckWrap))) { mrReturn = KMF_ERR_INTERNAL; goto cleanup; } @@ -232,47 +206,35 @@ PKCS_CreatePublicKey( /* Add algorithm specific attributes */ switch (ckKeyType) { case CKK_RSA: - if (!PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_MODULUS, - (CK_BYTE *)KeyParts[KMF_RSA_MODULUS].Data, - (CK_ULONG)KeyParts[KMF_RSA_MODULUS].Length) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_PUBLIC_EXPONENT, - (CK_BYTE *)KeyParts[KMF_RSA_PUBLIC_EXPONENT].Data, - (CK_ULONG)KeyParts[KMF_RSA_PUBLIC_EXPONENT].Length)) { - mrReturn = KMF_ERR_INTERNAL; - goto cleanup; + if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_MODULUS, + (CK_BYTE *)KeyParts[KMF_RSA_MODULUS].Data, + (CK_ULONG)KeyParts[KMF_RSA_MODULUS].Length) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_PUBLIC_EXPONENT, + (CK_BYTE *)KeyParts[KMF_RSA_PUBLIC_EXPONENT].Data, + (CK_ULONG)KeyParts[KMF_RSA_PUBLIC_EXPONENT].Length)) { + mrReturn = KMF_ERR_INTERNAL; + goto cleanup; } break; case CKK_DSA: - if (!PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_PRIME, - (CK_BYTE *)KeyParts[KMF_DSA_PRIME].Data, - (CK_ULONG)KeyParts[KMF_DSA_PRIME].Length) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_SUBPRIME, - (CK_BYTE *)KeyParts[KMF_DSA_SUB_PRIME].Data, - (CK_ULONG)KeyParts[KMF_DSA_SUB_PRIME].Length) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_BASE, - (CK_BYTE *)KeyParts[KMF_DSA_BASE].Data, - (CK_ULONG)KeyParts[KMF_DSA_BASE].Length) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - MAX_PUBLIC_KEY_TEMPLATES, - CKA_VALUE, - (CK_BYTE *)KeyParts[KMF_DSA_PUBLIC_VALUE].Data, - (CK_ULONG)KeyParts[KMF_DSA_PUBLIC_VALUE].Length)) { + if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_PRIME, + (CK_BYTE *)KeyParts[KMF_DSA_PRIME].Data, + (CK_ULONG)KeyParts[KMF_DSA_PRIME].Length) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_SUBPRIME, + (CK_BYTE *)KeyParts[KMF_DSA_SUB_PRIME].Data, + (CK_ULONG)KeyParts[KMF_DSA_SUB_PRIME].Length) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_BASE, + (CK_BYTE *)KeyParts[KMF_DSA_BASE].Data, + (CK_ULONG)KeyParts[KMF_DSA_BASE].Length) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + MAX_PUBLIC_KEY_TEMPLATES, CKA_VALUE, + (CK_BYTE *)KeyParts[KMF_DSA_PUBLIC_VALUE].Data, + (CK_ULONG)KeyParts[KMF_DSA_PUBLIC_VALUE].Length)) { mrReturn = KMF_ERR_INTERNAL; goto cleanup; } @@ -283,17 +245,15 @@ PKCS_CreatePublicKey( if (mrReturn == KMF_OK) { /* Instantiate the object */ - ckRv = C_CreateObject(ckSession, - ckTemplate, - ckNumTemplates, - pckPublicKey); + ckRv = C_CreateObject(ckSession, ckTemplate, + ckNumTemplates, pckPublicKey); if (ckRv != CKR_OK) mrReturn = KMF_ERR_INTERNAL; } cleanup: for (i = 0; i < uNumKeyParts; i++) { - KMF_FreeData(&KeyParts[i]); + kmf_free_data(&KeyParts[i]); } return (mrReturn); @@ -331,7 +291,7 @@ PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession, CK_ATTRIBUTE ckTemplate[3]; CK_ULONG ckNumTemplates; static const CK_ULONG ckMaxTemplates = (sizeof (ckTemplate) / - sizeof (CK_ATTRIBUTE)); + sizeof (CK_ATTRIBUTE)); CK_RV ckRv; /* Extract the data from the SPKI into individual fields */ @@ -343,31 +303,23 @@ PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession, /* Fetch the key class and algorithm from the object */ ckNumTemplates = 0; - if (!PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - ckMaxTemplates, - CKA_CLASS, - (CK_BYTE *)&ckObjClass, - sizeof (ckObjClass)) || - !PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - ckMaxTemplates, - CKA_KEY_TYPE, - (CK_BYTE *)&ckKeyType, - sizeof (ckKeyType))) { + if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + ckMaxTemplates, CKA_CLASS, (CK_BYTE *)&ckObjClass, + sizeof (ckObjClass)) || + !PKCS_AddTemplate(ckTemplate, &ckNumTemplates, + ckMaxTemplates, CKA_KEY_TYPE, (CK_BYTE *)&ckKeyType, + sizeof (ckKeyType))) { return (KMF_ERR_INTERNAL); } - ckRv = C_GetAttributeValue(ckSession, - ckKeyHandle, - ckTemplate, - ckNumTemplates); + ckRv = C_GetAttributeValue(ckSession, ckKeyHandle, + ckTemplate, ckNumTemplates); if (ckRv != CKR_OK) { return (ckRv); } /* Make sure the results match the expected values */ if ((ckKeyType != ckRequestedKeyType) || - (ckObjClass != CKO_PUBLIC_KEY)) { + (ckObjClass != CKO_PUBLIC_KEY)) { if (*pbTemporary == KMF_TRUE) { (void) C_DestroyObject(ckSession, ckKeyHandle); } @@ -419,21 +371,21 @@ PKCS_VerifyData(KMF_HANDLE_T kmfh, if (AlgorithmId == KMF_ALGID_NONE) return (KMF_ERR_BAD_ALGORITHM); - pAlgMap = PKCS_GetAlgorithmMap(KMF_ALGCLASS_SIGNATURE, - AlgorithmId, PKCS_GetDefaultSignatureMode(AlgorithmId)); + pAlgMap = pkcs_get_alg_map(KMF_ALGCLASS_SIGNATURE, + AlgorithmId, PKCS_GetDefaultSignatureMode(AlgorithmId)); if (!pAlgMap) return (KMF_ERR_BAD_ALGORITHM); rv = create_pk11_session(&ckSession, pAlgMap->pkcs_mechanism, - CKF_VERIFY); + CKF_VERIFY); if (rv != KMF_OK) return (rv); /* Fetch the verifying key */ rv = PKCS_AcquirePublicKeyHandle(ckSession, keyp, - pAlgMap->key_type, &ckKeyHandle, &bTempKey); + pAlgMap->key_type, &ckKeyHandle, &bTempKey); if (rv != KMF_OK) { (void) C_CloseSession(ckSession); @@ -454,11 +406,10 @@ PKCS_VerifyData(KMF_HANDLE_T kmfh, return (KMF_ERR_INTERNAL); } - ckRv = C_Verify(ckSession, - (CK_BYTE *)data->Data, - (CK_ULONG)data->Length, - (CK_BYTE *)signed_data->Data, - (CK_ULONG)signed_data->Length); + ckRv = C_Verify(ckSession, (CK_BYTE *)data->Data, + (CK_ULONG)data->Length, + (CK_BYTE *)signed_data->Data, + (CK_ULONG)signed_data->Length); if (ckRv != CKR_OK) { kmfh->lasterr.kstype = KMF_KEYSTORE_PK11TOKEN; @@ -493,16 +444,16 @@ PKCS_EncryptData(KMF_HANDLE_T kmfh, CK_ATTRIBUTE ckTemplate[2]; CK_ULONG ckNumTemplates; CK_ULONG ckMaxTemplates = (sizeof (ckTemplate) / - sizeof (CK_ATTRIBUTE)); + sizeof (CK_ATTRIBUTE)); - pAlgMap = PKCS_GetAlgorithmMap(KMF_ALGCLASS_SIGNATURE, + pAlgMap = pkcs_get_alg_map(KMF_ALGCLASS_SIGNATURE, AlgorithmId, PKCS_GetDefaultSignatureMode(AlgorithmId)); if (!pAlgMap) return (KMF_ERR_BAD_ALGORITHM); rv = create_pk11_session(&ckSession, pAlgMap->pkcs_mechanism, - CKF_ENCRYPT); + CKF_ENCRYPT); if (rv != KMF_OK) return (rv); @@ -518,22 +469,16 @@ PKCS_EncryptData(KMF_HANDLE_T kmfh, /* Get the modulus length */ ckNumTemplates = 0; - if (!PKCS_AddTemplate(ckTemplate, - &ckNumTemplates, - ckMaxTemplates, - CKA_MODULUS, - (CK_BYTE *)NULL, - sizeof (CK_ULONG))) { + if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates, ckMaxTemplates, + CKA_MODULUS, (CK_BYTE *)NULL, sizeof (CK_ULONG))) { if (bTempKey) (void) C_DestroyObject(ckSession, ckKeyHandle); (void) C_CloseSession(ckSession); return (KMF_ERR_INTERNAL); } - ckRv = C_GetAttributeValue(ckSession, - ckKeyHandle, - ckTemplate, - ckNumTemplates); + ckRv = C_GetAttributeValue(ckSession, ckKeyHandle, + ckTemplate, ckNumTemplates); if (ckRv != CKR_OK) { if (bTempKey) @@ -661,7 +606,9 @@ GetIDFromSPKI(KMF_X509_SPKI *spki, KMF_DATA *ID) ID->Length = SHA1_HASH_LENGTH; - algId = X509_AlgorithmOidToAlgId(&spki->algorithm.algorithm); + algId = x509_algoid_to_algid(&spki->algorithm.algorithm); + if (algId == KMF_ALGID_NONE) + return (KMF_ERR_BAD_ALGORITHM); rv = ExtractSPKIData(spki, algId, KeyParts, &uNumKeyParts); if (rv != KMF_OK) @@ -677,7 +624,6 @@ GetIDFromSPKI(KMF_X509_SPKI *spki, KMF_DATA *ID) rv = KMF_ERR_BAD_ALGORITHM; } - for (i = 0; i < uNumKeyParts; i++) { if (KeyParts[i].Data != NULL) free(KeyParts[i].Data); |