1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2025-04-21 12:27:27 +03:00

[generic-2.6] update OCF framework to version 20100325

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21356 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
jow
2010-05-04 20:59:19 +00:00
parent 64f1ed8de7
commit 40b344028b
192 changed files with 65222 additions and 4805 deletions

View File

@@ -5,7 +5,7 @@
*
* GPL LICENSE SUMMARY
*
* Copyright(c) 2007,2008 Intel Corporation. All rights reserved.
* Copyright(c) 2007,2008,2009 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
@@ -27,7 +27,7 @@
*
* BSD LICENSE
*
* Copyright(c) 2007,2008 Intel Corporation. All rights reserved.
* Copyright(c) 2007,2008,2009 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -57,7 +57,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* version: Security.L.1.0.130
* version: Security.L.1.0.2-229
*
***************************************************************************/
@@ -70,90 +70,94 @@ calling program uses different input buffer positions, these defines will have
to be changed.*/
/*DIFFIE HELLMAN buffer index values*/
#define ICP_DH_KRP_PARAM_PRIME_INDEX (0)
#define ICP_DH_KRP_PARAM_BASE_INDEX (1)
#define ICP_DH_KRP_PARAM_PRIVATE_VALUE_INDEX (2)
#define ICP_DH_KRP_PARAM_RESULT_INDEX (3)
#define ICP_DH_KRP_PARAM_PRIME_INDEX (0)
#define ICP_DH_KRP_PARAM_BASE_INDEX (1)
#define ICP_DH_KRP_PARAM_PRIVATE_VALUE_INDEX (2)
#define ICP_DH_KRP_PARAM_RESULT_INDEX (3)
/*MOD EXP buffer index values*/
#define ICP_MOD_EXP_KRP_PARAM_BASE_INDEX (0)
#define ICP_MOD_EXP_KRP_PARAM_EXPONENT_INDEX (1)
#define ICP_MOD_EXP_KRP_PARAM_MODULUS_INDEX (2)
#define ICP_MOD_EXP_KRP_PARAM_RESULT_INDEX (3)
#define SINGLE_BYTE_VALUE (4)
#define ICP_MOD_EXP_KRP_PARAM_BASE_INDEX (0)
#define ICP_MOD_EXP_KRP_PARAM_EXPONENT_INDEX (1)
#define ICP_MOD_EXP_KRP_PARAM_MODULUS_INDEX (2)
#define ICP_MOD_EXP_KRP_PARAM_RESULT_INDEX (3)
/*MOD EXP CRT buffer index values*/
#define ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_P_INDEX (0)
#define ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_Q_INDEX (1)
#define ICP_MOD_EXP_CRT_KRP_PARAM_I_INDEX (2)
#define ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DP_INDEX (3)
#define ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DQ_INDEX (4)
#define ICP_MOD_EXP_CRT_KRP_PARAM_COEFF_QINV_INDEX (5)
#define ICP_MOD_EXP_CRT_KRP_PARAM_RESULT_INDEX (6)
#define ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_P_INDEX (0)
#define ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_Q_INDEX (1)
#define ICP_MOD_EXP_CRT_KRP_PARAM_I_INDEX (2)
#define ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DP_INDEX (3)
#define ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DQ_INDEX (4)
#define ICP_MOD_EXP_CRT_KRP_PARAM_COEFF_QINV_INDEX (5)
#define ICP_MOD_EXP_CRT_KRP_PARAM_RESULT_INDEX (6)
/*DSA sign buffer index values*/
#define ICP_DSA_SIGN_KRP_PARAM_DGST_INDEX (0)
#define ICP_DSA_SIGN_KRP_PARAM_PRIME_P_INDEX (1)
#define ICP_DSA_SIGN_KRP_PARAM_PRIME_Q_INDEX (2)
#define ICP_DSA_SIGN_KRP_PARAM_G_INDEX (3)
#define ICP_DSA_SIGN_KRP_PARAM_X_INDEX (4)
#define ICP_DSA_SIGN_KRP_PARAM_R_RESULT_INDEX (5)
#define ICP_DSA_SIGN_KRP_PARAM_S_RESULT_INDEX (6)
#define ICP_DSA_SIGN_KRP_PARAM_DGST_INDEX (0)
#define ICP_DSA_SIGN_KRP_PARAM_PRIME_P_INDEX (1)
#define ICP_DSA_SIGN_KRP_PARAM_PRIME_Q_INDEX (2)
#define ICP_DSA_SIGN_KRP_PARAM_G_INDEX (3)
#define ICP_DSA_SIGN_KRP_PARAM_X_INDEX (4)
#define ICP_DSA_SIGN_KRP_PARAM_R_RESULT_INDEX (5)
#define ICP_DSA_SIGN_KRP_PARAM_S_RESULT_INDEX (6)
/*DSA verify buffer index values*/
#define ICP_DSA_VERIFY_KRP_PARAM_DGST_INDEX (0)
#define ICP_DSA_VERIFY_KRP_PARAM_PRIME_P_INDEX (1)
#define ICP_DSA_VERIFY_KRP_PARAM_PRIME_Q_INDEX (2)
#define ICP_DSA_VERIFY_KRP_PARAM_G_INDEX (3)
#define ICP_DSA_VERIFY_KRP_PARAM_PUBKEY_INDEX (4)
#define ICP_DSA_VERIFY_KRP_PARAM_SIG_R_INDEX (5)
#define ICP_DSA_VERIFY_KRP_PARAM_SIG_S_INDEX (6)
#define ICP_DSA_VERIFY_KRP_PARAM_DGST_INDEX (0)
#define ICP_DSA_VERIFY_KRP_PARAM_PRIME_P_INDEX (1)
#define ICP_DSA_VERIFY_KRP_PARAM_PRIME_Q_INDEX (2)
#define ICP_DSA_VERIFY_KRP_PARAM_G_INDEX (3)
#define ICP_DSA_VERIFY_KRP_PARAM_PUBKEY_INDEX (4)
#define ICP_DSA_VERIFY_KRP_PARAM_SIG_R_INDEX (5)
#define ICP_DSA_VERIFY_KRP_PARAM_SIG_S_INDEX (6)
/*DSA sign prime Q vs random number K size check values*/
#define DONT_RUN_LESS_THAN_CHECK (0)
#define FAIL_A_IS_GREATER_THAN_B (1)
#define FAIL_A_IS_EQUAL_TO_B (1)
#define SUCCESS_A_IS_LESS_THAN_B (0)
#define DSA_SIGN_RAND_GEN_VAL_CHECK_MAX_ITERATIONS (500)
#define DONT_RUN_LESS_THAN_CHECK (0)
#define FAIL_A_IS_GREATER_THAN_B (1)
#define FAIL_A_IS_EQUAL_TO_B (1)
#define SUCCESS_A_IS_LESS_THAN_B (0)
#define DSA_SIGN_RAND_GEN_VAL_CHECK_MAX_ITERATIONS (500)
/* We need to set a cryptokp success value just in case it is set or allocated
and not set to zero outside of this module */
#define CRYPTO_OP_SUCCESS (0)
#define CRYPTO_OP_SUCCESS (0)
/*Function to compute Diffie Hellman (DH) phase 1 or phase 2 key values*/
static int icp_ocfDrvDHComputeKey(struct cryptkop *krp);
/*Function to compute a Modular Exponentiation (Mod Exp)*/
static int icp_ocfDrvModExp(struct cryptkop *krp);
/*Function to compute a Mod Exp using the Chinease Remainder Theorem*/
static int icp_ocfDrvModExpCRT(struct cryptkop *krp);
/*Helper function to compute whether the first big number argument is less than
the second big number argument */
static int
icp_ocfDrvCheckALessThanB(CpaFlatBuffer * pK, CpaFlatBuffer * pQ, int *doCheck);
/*Function to sign an input with DSA R and S keys*/
static int icp_ocfDrvDsaSign(struct cryptkop *krp);
/*Function to Verify a DSA buffer signature*/
static int icp_ocfDrvDsaVerify(struct cryptkop *krp);
/*Callback function for DH operation*/
static void
icp_ocfDrvDhP1CallBack(void *callbackTag,
CpaStatus status,
void *pOpData, CpaFlatBuffer * pLocalOctetStringPV);
/*Callback function for ME operation*/
static void
icp_ocfDrvModExpCallBack(void *callbackTag,
CpaStatus status,
void *pOpData, CpaFlatBuffer * pResult);
/*Callback function for ME CRT operation*/
static void
icp_ocfDrvModExpCRTCallBack(void *callbackTag,
CpaStatus status,
void *pOpData, CpaFlatBuffer * pOutputData);
static void
icp_ocfDrvDsaVerifyCallBack(void *callbackTag,
CpaStatus status,
void *pOpData, CpaBoolean verifyStatus);
/*Callback function for DSA sign operation*/
static void
icp_ocfDrvDsaRSSignCallBack(void *callbackTag,
CpaStatus status,
@@ -161,12 +165,18 @@ icp_ocfDrvDsaRSSignCallBack(void *callbackTag,
CpaBoolean protocolStatus,
CpaFlatBuffer * pR, CpaFlatBuffer * pS);
/*Callback function for DSA Verify operation*/
static void
icp_ocfDrvDsaVerifyCallBack(void *callbackTag,
CpaStatus status,
void *pOpData, CpaBoolean verifyStatus);
/* Name : icp_ocfDrvPkeProcess
*
* Description : This function will choose which PKE process to follow
* based on the input arguments
*/
int icp_ocfDrvPkeProcess(device_t dev, struct cryptkop *krp, int hint)
int icp_ocfDrvPkeProcess(icp_device_t dev, struct cryptkop *krp, int hint)
{
CpaStatus lacStatus = CPA_STATUS_SUCCESS;
@@ -176,7 +186,7 @@ int icp_ocfDrvPkeProcess(device_t dev, struct cryptkop *krp, int hint)
return EINVAL;
}
if (CPA_TRUE == atomic_read(&icp_ocfDrvIsExiting)) {
if (CPA_TRUE == icp_atomic_read(&icp_ocfDrvIsExiting)) {
krp->krp_status = ECANCELED;
return ECANCELED;
}
@@ -258,8 +268,7 @@ int icp_ocfDrvPkeProcess(device_t dev, struct cryptkop *krp, int hint)
* It has been seen that in general we are passed little endian byte order
* buffers, but LAC only accepts big endian byte order buffers.
*/
static void inline
icp_ocfDrvSwapBytes(u_int8_t * num, u_int32_t buff_len_bytes)
static void inline icp_ocfDrvSwapBytes(u_int8_t * num, u_int32_t buff_len_bytes)
{
int i;
@@ -319,7 +328,9 @@ static int icp_ocfDrvDHComputeKey(struct cryptkop *krp)
callbackTag = krp;
pPhase1OpData = kmem_cache_zalloc(drvDH_zone, GFP_KERNEL);
/*All allocations are set to ICP_M_NOWAIT due to the possibility of getting
called in interrupt context*/
pPhase1OpData = icp_kmem_cache_zalloc(drvDH_zone, ICP_M_NOWAIT);
if (NULL == pPhase1OpData) {
APRINTK("%s():Failed to get memory for key gen data\n",
__FUNCTION__);
@@ -327,11 +338,12 @@ static int icp_ocfDrvDHComputeKey(struct cryptkop *krp)
return ENOMEM;
}
pLocalOctetStringPV = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
pLocalOctetStringPV =
icp_kmem_cache_zalloc(drvFlatBuffer_zone, ICP_M_NOWAIT);
if (NULL == pLocalOctetStringPV) {
APRINTK("%s():Failed to get memory for pLocalOctetStringPV\n",
__FUNCTION__);
kmem_cache_free(drvDH_zone, pPhase1OpData);
ICP_CACHE_FREE(drvDH_zone, pPhase1OpData);
krp->krp_status = ENOMEM;
return ENOMEM;
}
@@ -379,7 +391,7 @@ static int icp_ocfDrvDHComputeKey(struct cryptkop *krp)
EPRINTK("%s(): DH Phase 1 Key Gen failed (%d).\n",
__FUNCTION__, lacStatus);
icp_ocfDrvFreeFlatBuffer(pLocalOctetStringPV);
kmem_cache_free(drvDH_zone, pPhase1OpData);
ICP_CACHE_FREE(drvDH_zone, pPhase1OpData);
}
return lacStatus;
@@ -418,7 +430,7 @@ static int icp_ocfDrvModExp(struct cryptkop *krp)
callbackTag = krp;
pModExpOpData = kmem_cache_zalloc(drvLnModExp_zone, GFP_KERNEL);
pModExpOpData = icp_kmem_cache_zalloc(drvLnModExp_zone, ICP_M_NOWAIT);
if (NULL == pModExpOpData) {
APRINTK("%s():Failed to get memory for key gen data\n",
__FUNCTION__);
@@ -426,11 +438,11 @@ static int icp_ocfDrvModExp(struct cryptkop *krp)
return ENOMEM;
}
pResult = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
pResult = icp_kmem_cache_zalloc(drvFlatBuffer_zone, ICP_M_NOWAIT);
if (NULL == pResult) {
APRINTK("%s():Failed to get memory for ModExp result\n",
__FUNCTION__);
kmem_cache_free(drvLnModExp_zone, pModExpOpData);
ICP_CACHE_FREE(drvLnModExp_zone, pModExpOpData);
krp->krp_status = ENOMEM;
return ENOMEM;
}
@@ -445,35 +457,15 @@ static int icp_ocfDrvModExp(struct cryptkop *krp)
icp_ocfDrvSwapBytes(pModExpOpData->modulus.pData,
pModExpOpData->modulus.dataLenInBytes);
/*OCF patch to Openswan Pluto regularly sends the base value as 2
bits in size. In this case, it has been found it is better to
use the base size memory space as the input buffer (if the number
is in bits is less than a byte, the number of bits is the input
value) */
if (krp->krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_nbits <
NUM_BITS_IN_BYTE) {
DPRINTK("%s : base is small (%d)\n", __FUNCTION__, krp->
krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_nbits);
pModExpOpData->base.dataLenInBytes = SINGLE_BYTE_VALUE;
pModExpOpData->base.pData =
(uint8_t *) & (krp->
krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].
crp_nbits);
*((uint32_t *) pModExpOpData->base.pData) =
htonl(*((uint32_t *) pModExpOpData->base.pData));
} else {
DPRINTK("%s : base is big (%d)\n", __FUNCTION__, krp->
krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_nbits);
pModExpOpData->base.pData =
krp->krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_p;
BITS_TO_BYTES(pModExpOpData->base.dataLenInBytes,
krp->krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].
crp_nbits);
icp_ocfDrvSwapBytes(pModExpOpData->base.pData,
pModExpOpData->base.dataLenInBytes);
}
DPRINTK("%s : base (%d)\n", __FUNCTION__, krp->
krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_nbits);
pModExpOpData->base.pData =
krp->krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_p;
BITS_TO_BYTES(pModExpOpData->base.dataLenInBytes,
krp->krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].
crp_nbits);
icp_ocfDrvSwapBytes(pModExpOpData->base.pData,
pModExpOpData->base.dataLenInBytes);
pModExpOpData->exponent.pData =
krp->krp_param[ICP_MOD_EXP_KRP_PARAM_EXPONENT_INDEX].crp_p;
@@ -499,7 +491,7 @@ static int icp_ocfDrvModExp(struct cryptkop *krp)
__FUNCTION__, lacStatus);
krp->krp_status = ECANCELED;
icp_ocfDrvFreeFlatBuffer(pResult);
kmem_cache_free(drvLnModExp_zone, pModExpOpData);
ICP_CACHE_FREE(drvLnModExp_zone, pModExpOpData);
}
return lacStatus;
@@ -515,7 +507,6 @@ static int icp_ocfDrvModExp(struct cryptkop *krp)
* numbers. Although basic primality checks are done in LAC, it is up to the
* user to do any correct prime number checking before passing the inputs.
*/
static int icp_ocfDrvModExpCRT(struct cryptkop *krp)
{
CpaStatus lacStatus = CPA_STATUS_SUCCESS;
@@ -527,7 +518,8 @@ static int icp_ocfDrvModExpCRT(struct cryptkop *krp)
them here. */
callbackTag = krp;
rsaDecryptOpData = kmem_cache_zalloc(drvRSADecrypt_zone, GFP_KERNEL);
rsaDecryptOpData =
icp_kmem_cache_zalloc(drvRSADecrypt_zone, ICP_M_NOWAIT);
if (NULL == rsaDecryptOpData) {
APRINTK("%s():Failed to get memory"
" for MOD EXP CRT Op data struct\n", __FUNCTION__);
@@ -536,11 +528,11 @@ static int icp_ocfDrvModExpCRT(struct cryptkop *krp)
}
rsaDecryptOpData->pRecipientPrivateKey
= kmem_cache_zalloc(drvRSAPrivateKey_zone, GFP_KERNEL);
= icp_kmem_cache_zalloc(drvRSAPrivateKey_zone, ICP_M_NOWAIT);
if (NULL == rsaDecryptOpData->pRecipientPrivateKey) {
APRINTK("%s():Failed to get memory for MOD EXP CRT"
" private key values struct\n", __FUNCTION__);
kmem_cache_free(drvRSADecrypt_zone, rsaDecryptOpData);
ICP_CACHE_FREE(drvRSADecrypt_zone, rsaDecryptOpData);
krp->krp_status = ENOMEM;
return ENOMEM;
}
@@ -550,13 +542,13 @@ static int icp_ocfDrvModExpCRT(struct cryptkop *krp)
rsaDecryptOpData->pRecipientPrivateKey->
privateKeyRepType = CPA_CY_RSA_PRIVATE_KEY_REP_TYPE_2;
pOutputData = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
pOutputData = icp_kmem_cache_zalloc(drvFlatBuffer_zone, ICP_M_NOWAIT);
if (NULL == pOutputData) {
APRINTK("%s():Failed to get memory"
" for MOD EXP CRT output data\n", __FUNCTION__);
kmem_cache_free(drvRSAPrivateKey_zone,
rsaDecryptOpData->pRecipientPrivateKey);
kmem_cache_free(drvRSADecrypt_zone, rsaDecryptOpData);
ICP_CACHE_FREE(drvRSAPrivateKey_zone,
rsaDecryptOpData->pRecipientPrivateKey);
ICP_CACHE_FREE(drvRSADecrypt_zone, rsaDecryptOpData);
krp->krp_status = ENOMEM;
return ENOMEM;
}
@@ -658,9 +650,9 @@ static int icp_ocfDrvModExpCRT(struct cryptkop *krp)
__FUNCTION__, lacStatus);
krp->krp_status = ECANCELED;
icp_ocfDrvFreeFlatBuffer(pOutputData);
kmem_cache_free(drvRSAPrivateKey_zone,
rsaDecryptOpData->pRecipientPrivateKey);
kmem_cache_free(drvRSADecrypt_zone, rsaDecryptOpData);
ICP_CACHE_FREE(drvRSAPrivateKey_zone,
rsaDecryptOpData->pRecipientPrivateKey);
ICP_CACHE_FREE(drvRSADecrypt_zone, rsaDecryptOpData);
}
return lacStatus;
@@ -747,7 +739,8 @@ static int icp_ocfDrvDsaSign(struct cryptkop *krp)
return EDOM;
}
dsaRsSignOpData = kmem_cache_zalloc(drvDSARSSign_zone, GFP_KERNEL);
dsaRsSignOpData =
icp_kmem_cache_zalloc(drvDSARSSign_zone, ICP_M_NOWAIT);
if (NULL == dsaRsSignOpData) {
APRINTK("%s():Failed to get memory"
" for DSA RS Sign Op data struct\n", __FUNCTION__);
@@ -756,35 +749,35 @@ static int icp_ocfDrvDsaSign(struct cryptkop *krp)
}
dsaRsSignOpData->K.pData =
kmem_cache_alloc(drvDSARSSignKValue_zone, GFP_ATOMIC);
icp_kmem_cache_alloc(drvDSARSSignKValue_zone, ICP_M_NOWAIT);
if (NULL == dsaRsSignOpData->K.pData) {
APRINTK("%s():Failed to get memory"
" for DSA RS Sign Op Random value\n", __FUNCTION__);
kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
ICP_CACHE_FREE(drvDSARSSign_zone, dsaRsSignOpData);
krp->krp_status = ENOMEM;
return ENOMEM;
}
pR = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
pR = icp_kmem_cache_zalloc(drvFlatBuffer_zone, ICP_M_NOWAIT);
if (NULL == pR) {
APRINTK("%s():Failed to get memory"
" for DSA signature R\n", __FUNCTION__);
kmem_cache_free(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
ICP_CACHE_FREE(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
ICP_CACHE_FREE(drvDSARSSign_zone, dsaRsSignOpData);
krp->krp_status = ENOMEM;
return ENOMEM;
}
pS = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
pS = icp_kmem_cache_zalloc(drvFlatBuffer_zone, ICP_M_NOWAIT);
if (NULL == pS) {
APRINTK("%s():Failed to get memory"
" for DSA signature S\n", __FUNCTION__);
icp_ocfDrvFreeFlatBuffer(pR);
kmem_cache_free(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
ICP_CACHE_FREE(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
ICP_CACHE_FREE(drvDSARSSign_zone, dsaRsSignOpData);
krp->krp_status = ENOMEM;
return ENOMEM;
}
@@ -830,9 +823,9 @@ static int icp_ocfDrvDsaSign(struct cryptkop *krp)
"value\n", __FUNCTION__);
icp_ocfDrvFreeFlatBuffer(pS);
icp_ocfDrvFreeFlatBuffer(pR);
kmem_cache_free(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
ICP_CACHE_FREE(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
ICP_CACHE_FREE(drvDSARSSign_zone, dsaRsSignOpData);
krp->krp_status = EAGAIN;
return EAGAIN;
}
@@ -843,9 +836,9 @@ static int icp_ocfDrvDsaSign(struct cryptkop *krp)
"value less than Q value\n", __FUNCTION__);
icp_ocfDrvFreeFlatBuffer(pS);
icp_ocfDrvFreeFlatBuffer(pR);
kmem_cache_free(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
ICP_CACHE_FREE(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
ICP_CACHE_FREE(drvDSARSSign_zone, dsaRsSignOpData);
krp->krp_status = EAGAIN;
return EAGAIN;
}
@@ -869,13 +862,13 @@ static int icp_ocfDrvDsaSign(struct cryptkop *krp)
icp_ocfDrvSwapBytes(dsaRsSignOpData->X.pData,
dsaRsSignOpData->X.dataLenInBytes);
/*OpenSSL dgst parameter is left in big endian byte order,
therefore no byte swap is required */
dsaRsSignOpData->M.pData =
krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_DGST_INDEX].crp_p;
BITS_TO_BYTES(dsaRsSignOpData->M.dataLenInBytes,
krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_DGST_INDEX].
crp_nbits);
icp_ocfDrvSwapBytes(dsaRsSignOpData->M.pData,
dsaRsSignOpData->M.dataLenInBytes);
/* Output Parameters */
pS->pData = krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_S_RESULT_INDEX].crp_p;
@@ -899,9 +892,9 @@ static int icp_ocfDrvDsaSign(struct cryptkop *krp)
krp->krp_status = ECANCELED;
icp_ocfDrvFreeFlatBuffer(pS);
icp_ocfDrvFreeFlatBuffer(pR);
kmem_cache_free(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
ICP_CACHE_FREE(drvDSARSSignKValue_zone,
dsaRsSignOpData->K.pData);
ICP_CACHE_FREE(drvDSARSSign_zone, dsaRsSignOpData);
}
return lacStatus;
@@ -921,7 +914,8 @@ static int icp_ocfDrvDsaVerify(struct cryptkop *krp)
callbackTag = krp;
dsaVerifyOpData = kmem_cache_zalloc(drvDSAVerify_zone, GFP_KERNEL);
dsaVerifyOpData =
icp_kmem_cache_zalloc(drvDSAVerify_zone, ICP_M_NOWAIT);
if (NULL == dsaVerifyOpData) {
APRINTK("%s():Failed to get memory"
" for DSA Verify Op data struct\n", __FUNCTION__);
@@ -962,13 +956,13 @@ static int icp_ocfDrvDsaVerify(struct cryptkop *krp)
icp_ocfDrvSwapBytes(dsaVerifyOpData->Y.pData,
dsaVerifyOpData->Y.dataLenInBytes);
/*OpenSSL dgst parameter is left in big endian byte order,
therefore no byte swap is required */
dsaVerifyOpData->M.pData =
krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_DGST_INDEX].crp_p;
BITS_TO_BYTES(dsaVerifyOpData->M.dataLenInBytes,
krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_DGST_INDEX].
crp_nbits);
icp_ocfDrvSwapBytes(dsaVerifyOpData->M.pData,
dsaVerifyOpData->M.dataLenInBytes);
dsaVerifyOpData->R.pData =
krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_SIG_R_INDEX].crp_p;
@@ -993,48 +987,13 @@ static int icp_ocfDrvDsaVerify(struct cryptkop *krp)
if (CPA_STATUS_SUCCESS != lacStatus) {
EPRINTK("%s(): DSA Verify Operation failed (%d).\n",
__FUNCTION__, lacStatus);
kmem_cache_free(drvDSAVerify_zone, dsaVerifyOpData);
ICP_CACHE_FREE(drvDSAVerify_zone, dsaVerifyOpData);
krp->krp_status = ECANCELED;
}
return lacStatus;
}
/* Name : icp_ocfDrvReadRandom
*
* Description : This function will map RNG functionality calls from OCF
* to the LAC API.
*/
int icp_ocfDrvReadRandom(void *arg, uint32_t * buf, int maxwords)
{
CpaStatus lacStatus = CPA_STATUS_SUCCESS;
CpaCyRandGenOpData randGenOpData;
CpaFlatBuffer randData;
if (NULL == buf) {
APRINTK("%s(): Invalid input parameters\n", __FUNCTION__);
return EINVAL;
}
/* maxwords here is number of integers to generate data for */
randGenOpData.generateBits = CPA_TRUE;
randGenOpData.lenInBytes = maxwords * sizeof(uint32_t);
icp_ocfDrvPtrAndLenToFlatBuffer((Cpa8U *) buf,
randGenOpData.lenInBytes, &randData);
lacStatus = cpaCyRandGen(CPA_INSTANCE_HANDLE_SINGLE,
NULL, NULL, &randGenOpData, &randData);
if (CPA_STATUS_SUCCESS != lacStatus) {
EPRINTK("%s(): icp_LacSymRandGen failed (%d). \n",
__FUNCTION__, lacStatus);
return RETURN_RAND_NUM_GEN_FAILED;
}
return randGenOpData.lenInBytes / sizeof(uint32_t);
}
/* Name : icp_ocfDrvDhP1Callback
*
* Description : When this function returns it signifies that the LAC
@@ -1068,7 +1027,7 @@ icp_ocfDrvDhP1CallBack(void *callbackTag,
DPRINTK("%s(): Invalid input parameters - "
"pLocalOctetStringPV Data is NULL\n", __FUNCTION__);
memset(pPhase1OpData, 0, sizeof(CpaCyDhPhase1KeyGenOpData));
kmem_cache_free(drvDH_zone, pPhase1OpData);
ICP_CACHE_FREE(drvDH_zone, pPhase1OpData);
krp->krp_status = ECANCELED;
crypto_kdone(krp);
return;
@@ -1087,7 +1046,7 @@ icp_ocfDrvDhP1CallBack(void *callbackTag,
icp_ocfDrvFreeFlatBuffer(pLocalOctetStringPV);
memset(pPhase1OpData, 0, sizeof(CpaCyDhPhase1KeyGenOpData));
kmem_cache_free(drvDH_zone, pPhase1OpData);
ICP_CACHE_FREE(drvDH_zone, pPhase1OpData);
crypto_kdone(krp);
@@ -1128,7 +1087,7 @@ icp_ocfDrvModExpCallBack(void *callbackTag,
"pResult data is NULL\n", __FUNCTION__);
krp->krp_status = ECANCELED;
memset(pLnModExpOpData, 0, sizeof(CpaCyLnModExpOpData));
kmem_cache_free(drvLnModExp_zone, pLnModExpOpData);
ICP_CACHE_FREE(drvLnModExp_zone, pLnModExpOpData);
crypto_kdone(krp);
return;
}
@@ -1153,7 +1112,7 @@ icp_ocfDrvModExpCallBack(void *callbackTag,
}
icp_ocfDrvFreeFlatBuffer(pResult);
memset(pLnModExpOpData, 0, sizeof(CpaCyLnModExpOpData));
kmem_cache_free(drvLnModExp_zone, pLnModExpOpData);
ICP_CACHE_FREE(drvLnModExp_zone, pLnModExpOpData);
crypto_kdone(krp);
@@ -1196,10 +1155,10 @@ icp_ocfDrvModExpCRTCallBack(void *callbackTag,
"pOutputData is NULL\n", __FUNCTION__);
memset(pDecryptData->pRecipientPrivateKey, 0,
sizeof(CpaCyRsaPrivateKey));
kmem_cache_free(drvRSAPrivateKey_zone,
pDecryptData->pRecipientPrivateKey);
ICP_CACHE_FREE(drvRSAPrivateKey_zone,
pDecryptData->pRecipientPrivateKey);
memset(pDecryptData, 0, sizeof(CpaCyRsaDecryptOpData));
kmem_cache_free(drvRSADecrypt_zone, pDecryptData);
ICP_CACHE_FREE(drvRSADecrypt_zone, pDecryptData);
krp->krp_status = ECANCELED;
crypto_kdone(krp);
return;
@@ -1218,10 +1177,10 @@ icp_ocfDrvModExpCRTCallBack(void *callbackTag,
icp_ocfDrvFreeFlatBuffer(pOutputData);
memset(pDecryptData->pRecipientPrivateKey, 0,
sizeof(CpaCyRsaPrivateKey));
kmem_cache_free(drvRSAPrivateKey_zone,
pDecryptData->pRecipientPrivateKey);
ICP_CACHE_FREE(drvRSAPrivateKey_zone,
pDecryptData->pRecipientPrivateKey);
memset(pDecryptData, 0, sizeof(CpaCyRsaDecryptOpData));
kmem_cache_free(drvRSADecrypt_zone, pDecryptData);
ICP_CACHE_FREE(drvRSADecrypt_zone, pDecryptData);
crypto_kdone(krp);
@@ -1264,7 +1223,7 @@ icp_ocfDrvDsaRSSignCallBack(void *callbackTag,
DPRINTK("%s(): Invalid input parameter - "
"pR sign is NULL\n", __FUNCTION__);
icp_ocfDrvFreeFlatBuffer(pS);
kmem_cache_free(drvDSARSSign_zone, pSignData);
ICP_CACHE_FREE(drvDSARSSign_zone, pSignData);
krp->krp_status = ECANCELED;
crypto_kdone(krp);
return;
@@ -1274,7 +1233,7 @@ icp_ocfDrvDsaRSSignCallBack(void *callbackTag,
DPRINTK("%s(): Invalid input parameter - "
"pS sign is NULL\n", __FUNCTION__);
icp_ocfDrvFreeFlatBuffer(pR);
kmem_cache_free(drvDSARSSign_zone, pSignData);
ICP_CACHE_FREE(drvDSARSSign_zone, pSignData);
krp->krp_status = ECANCELED;
crypto_kdone(krp);
return;
@@ -1304,9 +1263,9 @@ icp_ocfDrvDsaRSSignCallBack(void *callbackTag,
icp_ocfDrvFreeFlatBuffer(pR);
icp_ocfDrvFreeFlatBuffer(pS);
memset(pSignData->K.pData, 0, pSignData->K.dataLenInBytes);
kmem_cache_free(drvDSARSSignKValue_zone, pSignData->K.pData);
ICP_CACHE_FREE(drvDSARSSignKValue_zone, pSignData->K.pData);
memset(pSignData, 0, sizeof(CpaCyDsaRSSignOpData));
kmem_cache_free(drvDSARSSign_zone, pSignData);
ICP_CACHE_FREE(drvDSARSSign_zone, pSignData);
crypto_kdone(krp);
return;
@@ -1368,7 +1327,7 @@ icp_ocfDrvDsaVerifyCallBack(void *callbackTag,
}
memset(pVerData, 0, sizeof(CpaCyDsaVerifyOpData));
kmem_cache_free(drvDSAVerify_zone, pVerData);
ICP_CACHE_FREE(drvDSAVerify_zone, pVerData);
crypto_kdone(krp);
return;