/** * This function process a block of data via the HASH Hardware. * The function receives as input an handle to the HASH Context , that was initialized before * by an CRYS_HASH_Init function or by other CRYS_HASH_Update * function. The function Sets the hardware with the last H's * value that where stored in the CRYS HASH context and then * process the data block using the hardware and in the end of * the process stores in the HASH context the H's value HASH * Context with the cryptographic attributes that are needed for * the HASH block operation ( initialize H's value for the HASH * algorithm ). This function is used in cases not all the data * is arrange in one continues buffer. * * The function flow: * * 1) checking the parameters validty if there is an error the function shall exit with an error code. * 2) Aquiring the working context from the CCM manager. * 3) If there isnt enouth data in the previous update data buff in the context plus the received data * load it to the context buffer and exit the function. * 4) fill the previous update data buffer to contain an entire block. * 5) Calling the hardware low level function to execute the update. * 6) fill the previous update data buffer with the data not processed at the end of the received data. * 7) release the CCM context. * * @param[in] ContextID_ptr - a pointer to the HASH context buffer allocated by the user that * is used for the HASH machine operation. * * @param DataIn_ptr a pointer to the buffer that stores the data to be * hashed . * * @param DataInSize The size of the data to be hashed in bytes. * * @return CRYSError_t on success the function returns CRYS_OK else non ZERO error. * */ CEXPORT_C CRYSError_t CRYS_HASH_Update(CRYS_HASHUserContext_t* ContextID_ptr, DxUint8_t* DataIn_ptr, DxUint32_t DataInSize ) { struct sep_ctx_hash *pHashContext; CRYS_HASHPrivateContext_t *pHashPrivContext; int symRc = DX_RET_OK; int hash_block_size_in_bytes = 0; if ( ContextID_ptr == DX_NULL ) { return CRYS_HASH_INVALID_USER_CONTEXT_POINTER_ERROR; } if( DataInSize == 0 ) { return CRYS_OK; } if( DataIn_ptr == DX_NULL ) { return CRYS_HASH_DATA_IN_POINTER_INVALID_ERROR; } // PRINT_INFO("--->NOW enter into CRYS_HASH_Update\n"); /* check validity for priv */ if (DxCcAcl_IsBuffAccessOk(ACCESS_READ_WRITE, ContextID_ptr, sizeof(CRYS_HASHUserContext_t))) { return CRYS_HASH_ILLEGAL_PARAMS_ERROR; } /* Get pointer to contiguous context in the HOST buffer */ pHashContext = (struct sep_ctx_hash *)DX_GetUserCtxLocation(ContextID_ptr->buff); pHashPrivContext = (CRYS_HASHPrivateContext_t *)&(((uint32_t*)pHashContext)[CRYS_HASH_USER_CTX_ACTUAL_SIZE_IN_WORDS-1]); if (pHashPrivContext->isLastBlockProcessed != 0) { return CRYS_HASH_LAST_BLOCK_ALREADY_PROCESSED_ERROR; } if (pHashContext->mode < SEP_HASH_SHA512) hash_block_size_in_bytes = CRYS_HASH_BLOCK_SIZE_IN_BYTES; else hash_block_size_in_bytes = CRYS_HASH_SHA512_BLOCK_SIZE_IN_BYTES; if ((DataInSize % hash_block_size_in_bytes) == 0) { symRc = SymDriverAdaptorProcess((struct sep_ctx_generic *)pHashContext, DataIn_ptr, NULL, DataInSize); if (symRc != DX_RET_OK) { return DX_CRYS_RETURN_ERROR(symRc, 0, SymAdaptor2CrysHashErr); } } else { /* this is the last block */ pHashPrivContext->isLastBlockProcessed = 1; symRc = SymDriverAdaptorFinalize((struct sep_ctx_generic *)pHashContext, DataIn_ptr, NULL, DataInSize); if (symRc != DX_RET_OK) { return DX_CRYS_RETURN_ERROR(symRc, 0, SymAdaptor2CrysHashErr); } } //PRINT_INFO("--->NOW leave CRYS_HASH_Update\n"); return CRYS_OK; }
CIMPORT_C CRYSError_t CRYS_HMAC_Update(CRYS_HMACUserContext_t *ContextID_ptr, DxUint8_t *DataIn_ptr, DxUint32_t DataInSize ) { struct sep_ctx_hmac *pHmacContext; CRYS_HMACPrivateContext_t *pHmacPrivContext; int symRc = DX_RET_OK; uint32_t blockSizeBytes; /* if the users context ID pointer is DX_NULL return an error */ if( ContextID_ptr == DX_NULL ) { return CRYS_HMAC_INVALID_USER_CONTEXT_POINTER_ERROR; } /* if the users Data In pointer is illegal and the size is not 0 return an error */ if( (DataIn_ptr == DX_NULL) && DataInSize ) { return CRYS_HMAC_DATA_IN_POINTER_INVALID_ERROR; } /* if the data size is zero no need to execute an update , return CRYS_OK */ if( DataInSize == 0 ) { return CRYS_OK; } /* check validity for priv */ if (DxCcAcl_IsBuffAccessOk(ACCESS_READ_WRITE, ContextID_ptr, sizeof(CRYS_HMACUserContext_t))) { return CRYS_HMAC_ILLEGAL_PARAMS_ERROR; } /* Get pointer to contiguous context in the HOST buffer */ pHmacContext = (struct sep_ctx_hmac *)DX_GetUserCtxLocation(ContextID_ptr->buff); pHmacPrivContext = (CRYS_HMACPrivateContext_t *)&(((uint32_t*)pHmacContext)[CRYS_HMAC_USER_CTX_ACTUAL_SIZE_IN_WORDS-1]); if (pHmacPrivContext->isLastBlockProcessed != 0) { return CRYS_HMAC_LAST_BLOCK_ALREADY_PROCESSED_ERROR; } blockSizeBytes = GetHmacBlocktSize(pHmacContext->mode); if ((DataInSize % blockSizeBytes) == 0) { symRc = SymDriverAdaptorProcess((struct sep_ctx_generic *)pHmacContext, DataIn_ptr, NULL, DataInSize); if (symRc != DX_RET_OK) { return DX_CRYS_RETURN_ERROR(symRc, 0, SymAdaptor2CrysHmacErr); } } else { /* this is the last block */ pHmacPrivContext->isLastBlockProcessed = 1; symRc = SymDriverAdaptorFinalize((struct sep_ctx_generic *)pHmacContext, DataIn_ptr, NULL, DataInSize); if (symRc != DX_RET_OK) { return DX_CRYS_RETURN_ERROR(symRc, 0, SymAdaptor2CrysHmacErr); } } return CRYS_OK; }
/** * @brief This function is used to process a stream on the RC4 machine. * This function should be called after the CRYS_RS4_Init. * * * @param[in] ContextID_ptr - A pointer to the RC4 context buffer allocated by the user * that is used for the RC4 machine operation. This should be the * same context as was used for the previous call of this session. * * @param[in] DataIn_ptr - The pointer to the buffer of the input data to the RC4. * The pointer's value does not need to be word-aligned. * * @param[in] DataInSize - The size of the input data. * * @param[in,out] DataOut_ptr - The pointer to the buffer of the output data from the RC4. * The pointer's value does not need to be word-aligned. * * @return CRYSError_t - CRYS_OK, * CRYS_RC4_INVALID_USER_CONTEXT_POINTER_ERROR, * CRYS_RC4_ILLEGAL_KEY_SIZE_ERROR, * CRYS_RC4_INVALID_KEY_POINTER_ERROR */ CIMPORT_C CRYSError_t CRYS_RC4_Stream(CRYS_RC4UserContext_t *ContextID_ptr, DxUint8_t *DataIn_ptr, DxUint32_t DataInSize, DxUint8_t *DataOut_ptr) { int symRc = DX_RET_OK; /* pointer on SEP RC4 context struct*/ struct sep_ctx_rc4 *pRc4Context; /* ............... checking the parameters validity ................... */ /* -------------------------------------------------------------------- */ /* if no data to process -we're done */ if (DataInSize == 0) { return CRYS_OK; } /* if the users context ID pointer is DX_NULL return an error */ if (ContextID_ptr == DX_NULL) { return CRYS_RC4_INVALID_USER_CONTEXT_POINTER_ERROR; } /* if the users Data In pointer is illegal return an error */ if (DataIn_ptr == DX_NULL) { return CRYS_RC4_DATA_IN_POINTER_INVALID_ERROR; } /* if the users Data Out pointer is illegal return an error */ if (DataOut_ptr == DX_NULL) { return CRYS_RC4_DATA_OUT_POINTER_INVALID_ERROR; } /* data size must be a positive number */ if (DataInSize == 0) { return CRYS_RC4_DATA_SIZE_ILLEGAL; } /* check validity for priv */ if (DxCcAcl_IsBuffAccessOk(ACCESS_READ_WRITE, ContextID_ptr, sizeof(CRYS_RC4UserContext_t))) { return CRYS_RC4_ILLEGAL_PARAMS_ERROR; } pRc4Context = (struct sep_ctx_rc4 *)DX_GetUserCtxLocation(ContextID_ptr->buff); symRc = SymDriverAdaptorProcess((struct sep_ctx_generic *)pRc4Context, DataIn_ptr, DataOut_ptr, DataInSize); return DX_CRYS_RETURN_ERROR(symRc, 0, SymAdaptor2CrysRc4Err); }
/*! * Memory copy using HW engines. * The table below describes the supported copy modes that * reference by the data input/output buffers: * * ---------------------------------------------- * | DataIn_ptr | DataOut_ptr | * |--------------------------------------------| * | SRAM | DCACHE/SRAM/DLLI/MLLI | * | ICACHE | DCACHE/SRAM/DLLI/MLLI | * | DCACHE | DCACHE/SRAM/DLLI/MLLI | * | DLLI | DCACHE/SRAM/DLLI | * | MLLI | DCACHE/SRAM/MLLI | * ---------------------------------------------- * * \param DataIn_ptr This is the source buffer which need to copy from. * It may be a SeP local address or a DMA Object handle as described * in the table above. * \param DataSize In bytes * \param DataOut_ptr This is the destination buffer which need to copy to. * It may be a SeP local address or a DMA Object handle as described * in the table above. * * Restriction: MLLI refers to DMA oject in System memory space. * * \return CRYSError_t On success CRYS_OK is returned, on failure an error according to * CRYS_Bypass_error.h */ CIMPORT_C CRYSError_t CRYS_Bypass(DxUint8_t* DataIn_ptr, DxUint32_t DataSize, DxUint8_t* DataOut_ptr) { /* The return error identifiers */ CRYSError_t Error = CRYS_OK; int symRc = DX_RET_OK; DxUint32_t ctxBuff[CRYS_BYPASS_BUFF_OF_WORDS] = {0x0}; /* pointer on SEP AES context struct*/ struct sep_ctx_generic *pSepContext = (struct sep_ctx_generic *)DX_InitUserCtxLocation(ctxBuff, sizeof(ctxBuff), sizeof(struct sep_ctx_generic)); /* data size must be a positive number and a block size mult */ if (DataSize == 0 ) return DX_SUCCESS; /* if the users Data In pointer is illegal return an error */ if ( DataIn_ptr == DX_NULL ) return CRYS_BYPASS_INVALID_INPUT_POINTER_ERROR; /* if the users Data Out pointer is illegal return an error */ if ( DataOut_ptr == DX_NULL ) return CRYS_BYPASS_INVALID_OUTPUT_POINTER_ERROR; Error = validateParams(DataIn_ptr, DataSize); if ( Error != CRYS_OK ) { return Error; } Error = validateParams(DataOut_ptr, DataSize); if ( Error != CRYS_OK ) { return Error; } pSepContext->alg = SEP_CRYPTO_ALG_BYPASS; symRc = SymDriverAdaptorProcess(pSepContext,DataIn_ptr, DataOut_ptr, DataSize); return DX_CRYS_RETURN_ERROR(symRc, 0, SymAdaptor2CrysBypassErr); }
/** * @brief This function is used to process a block on the DES machine. * This function should be called after the CRYS_DES_Init function was called. * * * @param[in] ContextID_ptr - a pointer to the DES context buffer allocated by the user that * is used for the DES machine operation. this should be the same context that was * used on the previous call of this session. * * @param[in] DataIn_ptr - The pointer to the buffer of the input data to the DES. The pointer does * not need to be aligned. * * @param[in] DataInSize - The size of the input data in bytes: must be not 0 and must be multiple * of 8 bytes. * * @param[in/out] DataOut_ptr - The pointer to the buffer of the output data from the DES. The pointer does not * need to be aligned. * * @return CRYSError_t - On success CRYS_OK is returned, on failure a * value MODULE_* crys_des_error.h */ CIMPORT_C CRYSError_t CRYS_DES_Block( CRYS_DESUserContext_t *ContextID_ptr, DxUint8_t *DataIn_ptr, DxUint32_t DataInSize, DxUint8_t *DataOut_ptr ) { int symRc = DX_RET_OK; /* pointer on SEP DES context struct*/ struct sep_ctx_cipher *pDesContext; /* if the users context ID pointer is DX_NULL return an error */ if( ContextID_ptr == DX_NULL ) { return CRYS_DES_INVALID_USER_CONTEXT_POINTER_ERROR; } /* if the users Data In pointer is illegal return an error */ if( DataIn_ptr == DX_NULL ) { return CRYS_DES_DATA_IN_POINTER_INVALID_ERROR; } /* if the users Data Out pointer is illegal return an error */ if( DataOut_ptr == DX_NULL ) { return CRYS_DES_DATA_OUT_POINTER_INVALID_ERROR; } /* data size must be a positive number and a block size mult */ if (((DataInSize % CRYS_DES_BLOCK_SIZE_IN_BYTES) != 0) || (DataInSize == 0)) { return CRYS_DES_DATA_SIZE_ILLEGAL; } /* check validity for priv */ if (DxCcAcl_IsBuffAccessOk(ACCESS_READ_WRITE, ContextID_ptr, sizeof(CRYS_DESUserContext_t))) { return CRYS_DES_ILLEGAL_PARAMS_ERROR; } /* Get pointer to contiguous context in the HOST buffer */ pDesContext = (struct sep_ctx_cipher *)DX_GetUserCtxLocation(ContextID_ptr->buff); symRc = SymDriverAdaptorProcess((struct sep_ctx_generic *)pDesContext, DataIn_ptr, DataOut_ptr, DataInSize); return DX_CRYS_RETURN_ERROR(symRc, 0, SymAdaptor2CrysDesErr); }
/*! * This function is used to process block of data in the combined or tunneling mode. * * \param pConfig A pointer to the Configuration Nodes array (NodesConfig). * This array represents the user combined scheme. * \param cipherOffset Relevant in cases where the authenticated data resides in * a different offset from the cipher data. * Note: currently an error returned for any value other than zero. * \param pDataIn A pointer on a block of input data ready for processing. * \param dataInSize The size of the input data. * \param pDataOut A pointer on output data. Could be the same as input data pointer * (for inplace operations) or NULL if there is only * authentication for output. * * \return CIMPORT_C CRYSError_t On success the value CRYS_OK is returned, * and on failure - a value from crys_combined_error.h */ CIMPORT_C CRYSError_t CRYS_Combined_Process( CrysCombinedConfig_t *pConfig, uint32_t cipherOffset, uint8_t *pDataIn, uint32_t dataInSize, uint8_t *pDataOut) { CRYS_COMBINED_UserContext_t combinedUsrCtx; struct sep_ctx_combined *pcombinedCtx; CRYSError_t crysErr = CRYS_OK; int symRc = DX_RET_OK; /* parameters check */ if (pConfig == DX_NULL) { return CRYS_COMBINED_INVALID_NODES_CONFIG_POINTER_ERROR; } if (cipherOffset != 0) { /*currently cipher address must be equal to the auth address*/ return CRYS_COMBINED_ILLEGAL_OPERATION_MODE_ERROR; } if (pDataIn == NULL) { return CRYS_COMBINED_DATA_IN_POINTER_INVALID_ERROR; } /* data size must be a positive number and a block size mult */ if (dataInSize == 0) { return CRYS_COMBINED_DATA_IN_SIZE_ILLEGAL; } /* check validity for priv */ if (DxCcAcl_IsBuffAccessOk(ACCESS_READ, pConfig, sizeof(CrysCombinedConfig_t))) { return CRYS_COMBINED_ILLEGAL_PARAMS_ERROR; } /* Get pointer to contiguous context in the HOST buffer */ pcombinedCtx = (struct sep_ctx_combined *)DX_InitUserCtxLocation(combinedUsrCtx.buff, sizeof(CRYS_COMBINED_UserContext_t), sizeof(struct sep_ctx_combined)); InitCombinedContext(pcombinedCtx, pConfig); switch (pcombinedCtx->mode) { case SEP_COMBINED_DIN_TO_AES_TO_HASH_MODE: break; case SEP_COMBINED_DIN_TO_AES_AND_HASH_MODE: case SEP_COMBINED_DIN_TO_AES_TO_HASH_AND_DOUT_MODE: case SEP_COMBINED_DIN_TO_AES_TO_AES_TO_DOUT_MODE: if (pDataOut == NULL) { return CRYS_COMBINED_DATA_OUT_POINTER_INVALID_ERROR; } break; default: return CRYS_COMBINED_ILLEGAL_OPERATION_MODE_ERROR; } crysErr = ValidateSupportedModes(pcombinedCtx); if (crysErr != CRYS_OK) { return crysErr; } symRc = SymDriverAdaptorProcess((struct sep_ctx_generic *)pcombinedCtx, pDataIn, pDataOut, dataInSize); return DX_CRYS_RETURN_ERROR(symRc, 0, SymAdaptor2CrysCombinedErr); }