diff options
Diffstat (limited to 'security/tf_crypto_sst/pkcs11_object.c')
-rw-r--r-- | security/tf_crypto_sst/pkcs11_object.c | 235 |
1 files changed, 116 insertions, 119 deletions
diff --git a/security/tf_crypto_sst/pkcs11_object.c b/security/tf_crypto_sst/pkcs11_object.c index 53caadc..7fcdb70 100644 --- a/security/tf_crypto_sst/pkcs11_object.c +++ b/security/tf_crypto_sst/pkcs11_object.c @@ -93,148 +93,117 @@ static CK_RV static_checkPreConditionsAndUpdateHandles( return CKR_OK; } -/******************************************/ -/* The buffer must be freed by the caller */ -/******************************************/ -static CK_RV static_encodeTwoTemplates( - uint8_t** ppBuffer, - uint32_t * pBufferSize, - const uint32_t nParamIndex, - CK_ATTRIBUTE* pTemplate1, - CK_ULONG ulCount1, - CK_ATTRIBUTE* pTemplate2, - CK_ULONG ulCount2) +/* Add up the sizes of the items and values in an attribute template. + */ +static CK_RV static_analyzeTemplate( + uint32_t *const pDataOffset, + uint32_t *const pBufferSize, + const CK_ATTRIBUTE *const pTemplate, + CK_ULONG const ulCount) { - INPUT_TEMPLATE_ITEM sItem; - - uint32_t i; - uint32_t nDataOffset = 0; - uint32_t nBufferIndex = 0; - uint32_t nBufferSize = 0; - uint8_t* pBuffer = NULL; - CK_RV nErrorCode = CKR_OK; + CK_ULONG i; + uint32_t nItemsSize; + uint32_t nValuesSize = 0; - if (ulCount1 == 0) - { - /* Nothing to do */ - return CKR_OK; - } - if (pTemplate1 == NULL) + nItemsSize = sizeof(uint32_t); /* for the number of attributes */ + if (ulCount == 0) { - /* Nothing to do */ + /* There are zero attributes, so the buffer will only contain the size word. */ + *pDataOffset += nItemsSize; + *pBufferSize += nItemsSize; return CKR_OK; } + nItemsSize += sizeof(INPUT_TEMPLATE_ITEM) * ulCount; /*for the attribute items*/ - /* First compute the total required buffer size that - * will contain the full templates (for the template 1 AND 2) - */ - nBufferSize = 4 + /* Nb Attributes */ - sizeof(INPUT_TEMPLATE_ITEM)*ulCount1; /* The attributes items */ - if (pTemplate2 != NULL) - { - nBufferSize += 4 + /* Nb Attributes */ - sizeof(INPUT_TEMPLATE_ITEM)*ulCount2; /* The attributes items */ - } - - /* First data (attribute values) on either template 1 or 2 will just be after the last item */ - nDataOffset = nBufferSize; - - for (i = 0; i < ulCount1; i++) - { - /* Each value will be aligned on 4 bytes. - This computation includes the spare bytes. */ - nBufferSize += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate1[i].ulValueLen); - } - if (pTemplate2 != NULL) + /* Add up the attribute value sizes, taking the 4-byte alignment into account. */ + for (i = 0; i < ulCount; i++) { - for (i = 0; i < ulCount2; i++) + if (*pBufferSize + nValuesSize > 0x40000000) { - /* Each value will be aligned on 4 bytes. - This computation includes the spare bytes. */ - nBufferSize += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate2[i].ulValueLen); + /* Offsets above 0x40000000 aren't supported. */ + return CKR_DEVICE_ERROR; } + nValuesSize += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate[i].ulValueLen); } - pBuffer = (uint8_t*)malloc(nBufferSize); - if (pBuffer == NULL) - { - /* Not enough memory */ - return CKR_DEVICE_MEMORY; - } - - memset(pBuffer, 0, nBufferSize); + *pDataOffset += nItemsSize; + *pBufferSize += nItemsSize + nValuesSize; + return CKR_OK; +} - /* - * First template - */ - *(uint32_t*)(pBuffer + nBufferIndex) = ulCount1; - nBufferIndex += 4; - for (i = 0; i < ulCount1; i++) +static void static_copyTemplate( + uint8_t *const pBuffer, + uint32_t const nParamIndex, + uint8_t **const ppAttributeCursor, + uint8_t **const ppDataCursor, + const CK_ATTRIBUTE *const pTemplate, + CK_ULONG const ulCount) +{ + INPUT_TEMPLATE_ITEM sItem; + CK_ULONG i; + *(uint32_t*)(*ppAttributeCursor) = ulCount; + *ppAttributeCursor += sizeof(uint32_t); + for (i = 0; i < ulCount; i++) { - sItem.attributeType = (uint32_t)pTemplate1[i].type; + sItem.attributeType = pTemplate[i].type; /* dataOffset = 0 means NULL buffer */ - sItem.dataOffset = ((pTemplate1[i].pValue == NULL) ? 0 : nDataOffset); + sItem.dataOffset = ((pTemplate[i].pValue == NULL) ? 0 : + *ppDataCursor - pBuffer); sItem.dataParamIndex = nParamIndex; /* The parameter where we store the data (0 to 3) */ - sItem.dataValueLen = (uint32_t)pTemplate1[i].ulValueLen; + sItem.dataValueLen = pTemplate[i].ulValueLen; /* Copy the item */ - memcpy(pBuffer + nBufferIndex, &sItem, sizeof(INPUT_TEMPLATE_ITEM)); - nBufferIndex += sizeof(INPUT_TEMPLATE_ITEM); - if (pTemplate1[i].pValue != NULL) + memcpy(*ppAttributeCursor, &sItem, sizeof(INPUT_TEMPLATE_ITEM)); + *ppAttributeCursor += sizeof(INPUT_TEMPLATE_ITEM); + if (pTemplate[i].pValue != NULL) { /* Copy the data */ - memcpy(pBuffer + nDataOffset, (uint8_t*)pTemplate1[i].pValue, (uint32_t)pTemplate1[i].ulValueLen); + memcpy(*ppDataCursor, pTemplate[i].pValue, pTemplate[i].ulValueLen); /* Next data will be stored just after the previous one but aligned on 4 bytes */ - nDataOffset += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate1[i].ulValueLen); - if ((nDataOffset & 0xC0000000) != 0) - { - /* We whould never go in this case, that means the dataOffset will not be able to store the offset correctly */ - nErrorCode = CKR_DEVICE_ERROR; - goto error; - } + *ppDataCursor += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate[i].ulValueLen); } } +} - /* - * Second template - */ - if (pTemplate2 != NULL) - { - *(uint32_t*)(pBuffer + nBufferIndex) = ulCount2; - nBufferIndex += 4; - for (i = 0; i < ulCount2; i++) - { - sItem.attributeType = (uint32_t)pTemplate2[i].type; - /* dataOffset = 0 means NULL buffer */ - sItem.dataOffset = ((pTemplate2[i].pValue == NULL) ? 0 : nDataOffset); - sItem.dataParamIndex = nParamIndex; /* The parameter where we store the data (0..3) */ - sItem.dataValueLen = (uint32_t)pTemplate2[i].ulValueLen; - /* Copy the item */ - memcpy(pBuffer + nBufferIndex, &sItem, sizeof(INPUT_TEMPLATE_ITEM)); - nBufferIndex += sizeof(INPUT_TEMPLATE_ITEM); - if (pTemplate2[i].pValue != NULL) - { - /* Copy the data */ - memcpy(pBuffer + nDataOffset, (uint8_t*)pTemplate2[i].pValue, (uint32_t)pTemplate2[i].ulValueLen); - /* Next data will be stored just after the previous one but aligned on 4 bytes */ - nDataOffset += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate2[i].ulValueLen); - if ((nDataOffset & 0xC0000000) != 0) - { - /* We whould never go in this case, that means the dataOffset will not be able to store the offset correctly */ - nErrorCode = CKR_DEVICE_ERROR; - goto error; - } - } - } - } +/******************************************/ +/* The buffer must be freed by the caller */ +/******************************************/ +static CK_RV static_encodeTwoTemplates( + uint8_t** ppBuffer, + uint32_t * pBufferSize, + const uint32_t nParamIndex, + const CK_ATTRIBUTE* pTemplate1, + CK_ULONG ulCount1, + const CK_ATTRIBUTE* pTemplate2, + CK_ULONG ulCount2) +{ + uint8_t* pBuffer = NULL; + uint32_t nBufferSize = 0; + uint32_t nDataOffset = 0; + uint8_t *pAttributeCursor; + uint8_t *pDataCursor; + CK_RV nErrorCode; + + nErrorCode = static_analyzeTemplate(&nDataOffset, &nBufferSize, pTemplate1, ulCount1); + if (nErrorCode != CKR_OK) return nErrorCode; + nErrorCode = static_analyzeTemplate(&nDataOffset, &nBufferSize, pTemplate2, ulCount2); + if (nErrorCode != CKR_OK) return nErrorCode; + + pBuffer = malloc(nBufferSize); + if (pBuffer == NULL) return CKR_DEVICE_MEMORY; + memset(pBuffer, 0, nBufferSize); + + pAttributeCursor = pBuffer; + pDataCursor = pBuffer + nDataOffset; + static_copyTemplate(pBuffer, nParamIndex, + &pAttributeCursor, &pDataCursor, + pTemplate1, ulCount1); + static_copyTemplate(pBuffer, nParamIndex, + &pAttributeCursor, &pDataCursor, + pTemplate2, ulCount2); *ppBuffer = pBuffer; *pBufferSize = nBufferSize; - return CKR_OK; - -error: - free(pBuffer); - return nErrorCode; } /******************************************/ @@ -247,7 +216,35 @@ static CK_RV static_encodeTemplate( CK_ATTRIBUTE* pTemplate, CK_ULONG ulCount) { - return static_encodeTwoTemplates(ppBuffer, pBufferSize, nParamIndex, pTemplate, ulCount, NULL, 0); + uint8_t* pBuffer = NULL; + uint32_t nBufferSize = 0; + uint32_t nDataOffset = 0; + uint8_t *pAttributeCursor; + uint8_t *pDataCursor; + CK_RV nErrorCode; + + if (pTemplate == NULL || ulCount == 0) + { + *ppBuffer = NULL; + *pBufferSize = 0; + return CKR_OK; + } + + nErrorCode = static_analyzeTemplate(&nDataOffset, &nBufferSize, pTemplate, ulCount); + if (nErrorCode != CKR_OK) return nErrorCode; + + pBuffer = malloc(nBufferSize); + if (pBuffer == NULL) return CKR_DEVICE_MEMORY; + + pAttributeCursor = pBuffer; + pDataCursor = pBuffer + nDataOffset; + static_copyTemplate(pBuffer, nParamIndex, + &pAttributeCursor, &pDataCursor, + pTemplate, ulCount); + + *ppBuffer = pBuffer; + *pBufferSize = nBufferSize; + return CKR_OK; } /* ----------------------------------------------------------------------- */ @@ -1268,7 +1265,7 @@ CK_RV PKCS11_EXPORT C_GenerateKeyPair( PPKCS11_PRIMARY_SESSION_CONTEXT pSession; if ( (pMechanism == NULL) || - (pPublicKeyTemplate == NULL) || (pPrivateKeyTemplate == NULL) || + (pPublicKeyTemplate == NULL) || (phPublicKey== NULL) || (phPrivateKey== NULL)) { return CKR_ARGUMENTS_BAD; @@ -1280,7 +1277,7 @@ CK_RV PKCS11_EXPORT C_GenerateKeyPair( return nErrorCode; } - nErrorCode = static_encodeTwoTemplates(&pBuffer, &nBufferSize, 2, (CK_ATTRIBUTE*)pPublicKeyTemplate, ulPublicKeyAttributeCount, (CK_ATTRIBUTE*)pPrivateKeyTemplate, ulPrivateKeyAttributeCount); + nErrorCode = static_encodeTwoTemplates(&pBuffer, &nBufferSize, 2, pPublicKeyTemplate, ulPublicKeyAttributeCount, pPrivateKeyTemplate, ulPrivateKeyAttributeCount); if (nErrorCode != CKR_OK) { return nErrorCode; |