blob: 25eca2c7802522956d86881beca34acdab8d0646 [file] [log] [blame]
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2007
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* che_api.h
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* Cipher/Hash Engine API.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
*
* removed!
* removed!
*
*
* removed!
* removed!
*
*
* removed!
* removed!
*
*
* removed!
* removed!
*
*
* removed!
* removed!
*
*
* removed!
* removed!
*
*
* removed!
* removed!
*
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
/*! \mainpage Cipher Hash Engine
* @author Julie Yang
* @version 1.0
* @date 2007/06/14
*
* \section CHE CHE API Introduction
*
* This document is an introduction of MTK Cipher and Hash Engine API. There is an interface
* between Application and Cipher/Hash engine. The interface layer includes four functions.
* User and application can just use these four functions to set
* cipher/hash condition, and trigger the process of the cipher/hash engine. Either the
* bottom layer is hardware or software driver.\n\n
*
* CHE API also release four enum structures to define the setting parameters for AP using.
* User can just use these structures to set cipher/hash conditions,
* and trigger the process of the cipher/hash engine.\n
*
* The header file is in \\mcu\\applib\\misc\\include\\che_api.h\n
*
* The API is supported after 07A branch. \n
*
*
*/
/** @defgroup CHE Cipher/Hash Engine Interface
* @{
*/
/** @defgroup CHE Cipher/Hash Engine Interface
* @{
*/
#ifndef _CHE_API_H
#define _CHE_API_H
#include "kal_public_api.h" //MSBB change #include "kal_release.h"
#include "fsal.h"
//#include "md5.h"
//#include "sha1.h"
//#include "md4.h"
/* DOM-NOT_FOR_SDK-BEGIN */
/* DNS context structure */
typedef struct DES_CNXT_T
{
#if defined(__HW_CHE__)
kal_uint8 cheCKey[36]; /* des; 3des;convert_aes_128_key;convert_aes_192_key;convert_aes_256_key */
kal_uint8 cheDataAddr[120]; /* che_hw_des;che_hw_aes;che_hw_hash */
#else /* defined(__HW_CHE__) */
kal_uint8 cheLastBlock[16]; /* Last block used in counter mode (store the previous cipher text) */
kal_uint8 cheLastReminder[16]; /* Last remainder block */
kal_uint8 cheKeySchedule[128]; /* key schedule */
kal_uint8 iv[64]; /* initial vector */
#endif /* defined(__HW_CHE__) */
}DES_CNXT;
/* AES context structure */
typedef struct AES_CNXT_T
{
#if defined(__HW_CHE__)
kal_uint8 cheCKey[36]; /* des; 3des;convert_aes_128_key;convert_aes_192_key;convert_aes_256_key */
kal_uint8 cheDataAddr[120]; /* che_hw_des;che_hw_aes;che_hw_hash */
#else /* defined(__HW_CHE__) */
kal_uint8 cheLastReminder[16]; /* Last remaining segment */
kal_uint8 orgIV[64]; /* Initial vector */
#endif /* defined(__HW_CHE__) */
}AES_CNXT;
/* MD5 and SH1 structure */
typedef struct MD5_CNXT_T
{
#if defined(__HW_CHE__)
kal_uint8 cheDataAddr[120]; /* che_hw_des;che_hw_aes;che_hw_hash */
#else
kal_uint8 *working_buffer; /* working buffer */
#endif
}MD5_CNXT, SHA1_CNXT;
/* structure used for MD5,SHA1, MAC_MD5, MAC_SHA1, MD4, DHM */
typedef struct CNXT_T
{
kal_uint8 *working_buffer; /* working buffer */
}SW_MISC_CNXT;
/* RC4 structure */
typedef struct RC4_CNXT_T
{
kal_uint32 x, y; /* the swap index */
kal_uint8 keyStream[256]; /* key stream */
} RC4_CNXT;
/* used only for HW HASH ;che_hw_des;che_hw_aes;che_hw_hash */
typedef struct HASH_CNXT_T
{
kal_uint8 cheDataAddr[120]; /* Data address */
}HASH_CNXT;
/* RSA structure */
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
/* #define __CHE_RSA_GEN_KEY__ */
/** The structure STCHE is defined to record and maintain the context of CHE */
typedef struct STCHE_T
{
kal_uint32 cheLastLength; /* last block length */
kal_uint8 *cheLastDstAddr; /* last destination address */
kal_uint8 *cheWorkBuf; /* pointe to a space used by each algorithm */
kal_uint32 cheBufLen; /* the length of cheWorkBuf. It depends on the encrypt algorithm */
kal_uint32 cipher_type; /* cipher type */
kal_uint8 *cheKey; /* key stream */
kal_uint8 *cheIV; /* initial vector */
kal_uint32 cheKeyLength; /* key stream length */
kal_uint32 cheIVLength; /* initial vector length */
#if defined(__HW_CHE__)
kal_bool cheResetKeyFlag; /* Reset key flag */
kal_bool cheResetIVFlag; /* Reset initial vector flag */
#endif /* defined(__HW_CHE__) */
kal_bool cheFirstFlag; /* first block flag */
} STCHE;
/* DOM-NOT_FOR_SDK-END */
/* CHE error cause */
typedef enum
{
CHE_OK = 0, /* success */
CHE_ERROR = -1, /* error occurs */
CHE_KEY_CHK_FAIL = -2, /* public or private key check fail */
CHE_INVALID_LENGTH = -3, /* buffer length too small or too long */
CHE_OPERATION_FAIL = -4 /* che operation fails, such as cipher fail */
} che_result_error_enum;
/** CHE_TYPE define the cipher and hash function algorithm type */
typedef enum
{
CHE_MD5 = 1, /* MD5 hash algorithm. The output length is fixed 16 bytes */
CHE_DES, /* DES block cipher algorithm. The CHE will do auto padding in DES type.
The maximum padding length is 8 bytes */
CHE_3DES, /* 3DES block cipher algorithm. The CHE will do auto padding in 3DES type.
The maximum padding length is 8 bytes */
CHE_AES, /* AES block cipher algorithm. The CHE will do auto padding in AES(ECB, CBC) type.
The maximum padding length is 16 bytes */
CHE_MAC_MD5, /* HMAC_MD5 hash algorithm. The output length is fixed 16 bytes */
CHE_RC4, /* RC4 stream cipher algorithm. No padding */
CHE_DH, /* Diffie Hellman cipher algorithm used to generate the key. No padding */
CHE_MAC_SHA224, /* HMAC_SHA224 hash algorithm. The output length is fixed 28 bytes */
CHE_MAC_SHA256, /* HMAC_SHA256 hash algorithm. The output length is fixed 32 bytes */
CHE_SHA224, /* SHA 224 algorithm */
CHE_SHA256 /* SHA 256 algorithm */
//CHE_SHA1, /* SHA1 hash algorithm. The output length is fixed 20 bytes */
//CHE_MD4, /* MD4 hash algorithm. The output length is fixed 16 bytes */
//CHE_MAC_SHA1, /* HMAC_SHA1 hash algorithm. The output length is fixed 20 bytes */
//CHE_RSA, /* RSA asym cipher algorithm. */
} CHE_TYPE;
/* CHE_OPERATION_MODE define the cipher function mode. For hash function, it could be set CHE_MODE_NULL */
typedef enum
{
CHE_MODE_NULL = 0, /* null mode. This mode is used when there is no mode operation */
CHE_ECB, /* AES/DES ECB mode */
CHE_CBC, /* AES/DES CBC mode */
CHE_CTR, /* AES CTR(counter) mode */
CHE_F8, /* AES F8 mode */
CHE_SKIP, /* RC4 Skip mode */
CHE_KEY_WRAP, /* AES key wrap mode */
CHE_KEY_UNWRAP /* AES key unwrap mode */
} CHE_OPERATION_MODE;
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
/* CHE_ACTION define this CHE process should run hash, encipher or decipher */
typedef enum
{
CHE_HASH, /* generate hash value */
CHE_ENC, /* encryption data */
CHE_DEC, /* decryption data */
CHE_MAC_HASH, /* generate HMAC value */
DH_INIT, /* initialize the Diffie-Hellman */
DH_MAKE_PARAMS, /* Suppose A=G^a mod p. generate discrete logarithms(a) and A */
DH_MAKE_PUBLIC, /* Suppose A=G^a mod p. generate discrete logarithms(a) and A */
DH_CALC_SECRET, /* Suppose B=G^b mod p. Calculate the shared secret (G^b)^a mod P */
DH_FREE /* finialize the Diffie-Hellman */
} CHE_ACTION;
/* CHE_KEY_ACTION define the CHE Key process. The life cycle of input key buffer should
* be maintained until che_deinit except RSA.
*/
typedef enum
{
CHE_GEN_KEY, /* generate the key exclude asynmetry and RC4 algirhtm */
CHE_SET_KEY, /* set the key exclude asynmetry and RC4 algirhtm */
CHE_GET_KEY, /* get the key exclude asynmetry and RC4 algirhtm*/
CHE_DEL_KEY, /* delete the key exclude asynmetry and RC4 algirhtm */
CHE_SET_RC4_KEY, /* set the RC4 key */
#if defined(__CHE_RSA_GEN_KEY__)
CHE_GEN_RSA_KEY, /* generate RSA key for hardware */
CHE_DEL_RSA_KEY, /* delete the RSA key for hardward */
#endif /* defined(__CHE_RSA_GEN_KEY__) */
CHE_SET_RSA_N, /* set the RSA modulus N. N=P*Q. N is prime number.
The input N is a binary data */
CHE_SET_RSA_E, /* set the RSA public exponent: E.
The input E is a binary data */
CHE_SET_RSA_D, /* set the RSA private exponent: D.
The input D is a binary data */
CHE_SET_RSA_P, /* set the RSA modulus P(CRT format).
The input P is a binary data */
CHE_SET_RSA_Q, /* set the RSA modulus Q(CRT format).
The input Q is the binary data */
CHE_SET_RSA_dModPm1, /* set the RSA private exponent(CRT format): DP.
The input DP is a binary data */
CHE_SET_RSA_dModQm1, /* set the RSA private exponent(CRT format): DQ.
The input DQ is a binary data */
CHE_SET_RSA_qInvModP, /* set the coefficient Integer(CRT format): inverse Q.
The input InvQ is a binary data */
CHE_SET_DH_P, /* set the DH modulus: P. The input P is a binary data. */
CHE_SET_DH_G, /* set the DH prime root: G. The input G is a binary data */
CHE_SET_DH_SELF_PUBLIC, /* set the self public value. G^X mod P. The input is a binary data. */
CHE_SET_DH_PEER_PUBLIC, /* set the peer public value. G^Y mod P. The input is a binary data. */
CHE_SET_DH_PRIVATE, /* set the discrete logarithms(private key): X.
The input X is a binary data. */
CHE_GET_DH_SELF_PUBLIC_LEN, /* get the self public length */
CHE_GET_DH_PRIVATE_LEN, /* get the discrete logarithm length */
CHE_GET_DH_SECRET_LEN, /* get the secret length */
CHE_GET_DH_SELF_PUBLIC, /* get self public value */
CHE_GET_DH_PRIVATE, /* get the discrete logarithm */
CHE_GET_DH_SECRET, /* get the shared key,i.e. key. key = GY^X mod P */
CHE_GET_RSA_N, /* get the RSA modulus N. N=P*Q. N is prime number. The output N is binary data */
CHE_GET_RSA_E, /* get the RSA public exponent: E. The output E is a binary data */
CHE_GET_RSA_D, /* get the RSA private exponent: D. The output D is a binary data */
CHE_GET_RSA_P, /* get the RSA modulus P(CRT format). The output P is a binary data */
CHE_GET_RSA_Q, /* get the RSA modulus Q(CRT format). The output Q is the binary data */
CHE_GET_RSA_dModPm1, /* get the RSA private exponent(CRT format): DP. The output DP is a binary data */
CHE_GET_RSA_dModQm1, /* get the RSA private exponent(CRT format): DQ. The output DQ is a binary data */
CHE_GET_RSA_qInvModP, /* get the coefficient Integer(CRT format): inverse Q. The output InvQ is a binary data */
CHE_GET_RSA_N_LEN, /* get the RSA modulus N. N=P*Q. N is prime number. The output N is binary data */
CHE_GET_RSA_E_LEN, /* get the RSA public exponent: E. The output E is a binary data */
CHE_GET_RSA_D_LEN, /* get the RSA private exponent: D. The output D is a binary data */
CHE_GET_RSA_P_LEN, /* get the RSA modulus P(CRT format). The output P is a binary data */
CHE_GET_RSA_Q_LEN, /* get the RSA modulus Q(CRT format). The output Q is the binary data */
CHE_GET_RSA_dModPm1_LEN, /* get the RSA private exponent(CRT format): DP. The output DP is a binary data */
CHE_GET_RSA_dModQm1_LEN, /* get the RSA private exponent(CRT format): DQ. The output DQ is a binary data */
CHE_GET_RSA_qInvModP_LEN /* get the coefficient Integer(CRT format): inverse Q. The output InvQ is a binary data */
} CHE_KEY_ACTION;
typedef enum
{
CHE_NO_ERROR = 0, /* success */
CHE_NOT_SUPPORT_ALGO, /* not support error */
CHE_INVALID_NULL_POINTER, /* input NULL pointer */
CHE_INVALID_KEY_POINTER, /* key NULL pointer */
CHE_CALCULATE_FAIL /* calculate fail */
} CHE_CALCULATE_ERROR;
#include "che_trick.h"
/*****************************************************************************
* FUNCTION
* che_init
* DESCRIPTION
* Initialize the CHE_CONTEXT data structure created from AP
* PARAMETERS
* che_context : [IN] CHE context
* type : [IN] CHE type (CHE_TYPE)
* RETURN VALUES
* void
* SEE ALSO
* che_deinit
* EXAMPLE
* <code>
* STCHE context;
* che_init(&context, CHE_SHA1);
* </code>
*****************************************************************************/
extern void che_init(STCHE *che_context, kal_uint32 type);
/*****************************************************************************
* FUNCTION
* che_deinit
* DESCRIPTION
* Deinitialize the CHE_CONTEXT
* PARAMETERS
* che_context : [IN] CHE context
* RETURN VALUES
* void
* SEE ALSO
* che_init
* EXAMPLE
* <code>
* STCHE context;
* che_init(&context, CHE_SHA1);
* ...
* che_deinit(&context);
* </code>
*****************************************************************************/
extern void che_deinit(STCHE *che_context);
/*****************************************************************************
* DESCRIPTION
* API used to set, get, delete, generate the key value.
* If user uses this API to get the key, CHE only stores the pointer of the key.
* Thus, the key has to be kept until the che_deinit is called. There is only
* One exception, in the RSA, we will allocate another space to store the key.
* Thus, user doesn't have to care if they can release the buffer of key.
* PARAMETERS
* che_context : [IN] che context
* key_act : [IN] key action (CHE_KEY_ACTION)
* key : [IN/OUT] key stream
* key_ley : [IN] key stream length
* EXAMPLE
* <code>
* STCHE che_context;
* che_init(&che_context, CHE_MAC_MD5);
* che_key_action(&che_context, CHE_SET_KEY, (kal_uint8 *) key, key_len);
* </code>
*****************************************************************************/
#define che_key_action(che_context, key_act, key, key_len) \
\
((void)TRICK_##key_act, run_##key_act##_process(che_context, key, key_len))
/*****************************************************************************
* FUNCTION
* che_set_iv
* DESCRIPTION
* Set initial vector for CBC or CTR or AES_F8 mode. CHE only stores the pointer address.
* The iv buffer should be kept by the user until the first block is computed.
* To avoid confusion, user can keep the buffer until the che_deinit is called.
* PARAMETERS
* che_context : [IN] CHE context
* iv : [IN] initial vector.
* the input has to be 4-byte alignment on ARM platform
* iv_len : [IN] initial vector length
* RETURN VALUES
* void
* EXAMPLE
* <code>
* STCHE context;
* che_init(&context, CHE_AES);
* che_set_iv(&che_context, iv, 16);
* ...
* che_deinit(&context);
* </code>
*****************************************************************************/
extern void che_set_iv(STCHE *che_context, kal_uint8 *iv, kal_uint32 iv_len);
/*****************************************************************************
* DESCRIPTION
* API used to execute cipher and hash process function.
* Since using Marco to reduce linkage code size, please pass the "type" parameter
* as the constant announced in CHE_TYPE enum. It doesn't allow passing variable.
* The dest buffer size should be refer to the RFC standard specification.
* The DES/AES in CBC/ECB mode will do the auto padding if application uses the CHE's auto padding,
* the destination buffer address has to be at least source_length + 1 DES block size(8 bytes) .
* Otherwise, there will be a memory corruption. If application doesn't want to use auto padding,
* it cannot set the last_block to "TRUE". That is to say, as long as the last_block is not set to
* TRUE, there will no auto padding. The auto padding CHE uses is PKCS#1 v15. This padding is standard
* padding used in PCKS#5.
* P.S. The input and output buffer should be different buffer. Don't use the same buffer.
*
* PARAMETERS
* che_context : [IN] che context
* type : [IN] che type (CHE_TYPE)
* mode : [IN] che operation mode (CHE_OPERATION_MODE)
* act : [IN] che action (CHE_ACTION)
* source : [IN] source input data buffer (it has to be 4-byte alignment for DES and AES)
* dest : [OUT] destination buffer (it has to be 4-byte alignment for DES)
* source_length : [IN] source input buffer length
* final : [IN] KAL_TRUE: do the standard auto padding(PKCS#5).
* KAL_FLASE: don't do the standard auto padding(PKCS#5).
* If user wants the auto padding, s/he has to set the final to TRUE in its final block
* operation. On the contrary, if s/he doesn't want the auto padding, please do not set
* final to TRUE.
* RETURN VALUES
* KAL_TRUE : CHE process successful
* KAL_FLASE : CHE process fail
* SEE ALSO
* che_process_from_file
* EXAMPLE
* Symmetry Block Cipher Examples:
*
* 1. DES Encryption (CBC mode):
* The input, initial vector and destination address have to be in 4-byte alignment.
*
* With auto padding:
* <code>
* STCHE che_context;
* che_init(&che_context, CHE_DES);
* che_key_action(&che_context, CHE_SET_KEY, key, key_length);
* che_set_iv(&che_context, init_vector, vec_length);
* che_process(&che_context, CHE_DES, CHE_CBC , CHE_ENC, src_buffer, dst_buffer, src_len, KAL_FALSE);
* ...
* //if the last segmemnt in source buffer is intended to be processed and we want to use the auto padding,
* //we set final to TRUE
* che_process(&che_context, CHE_DES, CHE_CBC , CHE_ENC, src_buffer, dst_buffer, src_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_context);
* </code>
*
* Without auto padding:
* <code>
* STCHE che_context;
* che_init(&che_context, CHE_DES);
* che_key_action(&che_context, CHE_SET_KEY, key, key_length);
* che_set_iv(&che_context, init_vector, vec_length);
* che_process(&che_context, CHE_DES, CHE_CBC , CHE_ENC, src_buffer, dst_buffer, src_len, KAL_FALSE);
* ...
* //if the last segmemnt in source buffer is intended to be processed and we don't want the auto padding,
* //we set final to FALSE
* che_process(&che_context, CHE_DES, CHE_CBC , CHE_ENC, src_buffer, dst_buffer, src_len, KAL_FALSE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_context);
* </code>
* 2. DES Encryption (ECB mode):
* With auto padding:
* <code>
* STCHE che_context;
* che_init(&che_context, CHE_DES);
* che_key_action(&che_context, CHE_SET_KEY, key, key_length);
* che_process(&che_context, CHE_DES, CHE_ECB , CHE_ENC, src_buffer, dst_buffer, src_len, KAL_FALSE);
* ...
* //if the last segmemnt in source buffer is intended to be processed and we want to use the auto padding,
* //we set final to TRUE
* che_process(&che_context, CHE_DES, CHE_ECB , CHE_ENC, src_buffer, dst_buffer, src_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_context);
* </code>
*
* Without auto padding:
* <code>
* STCHE che_context;
* che_init(&che_context, CHE_DES);
* che_key_action(&che_context, CHE_SET_KEY, key, key_length);
* che_process(&che_context, CHE_DES, CHE_ECB , CHE_ENC, src_buffer, dst_buffer, src_len, KAL_FALSE);
* ...
* //if the last segmemnt in source buffer is intended to be processed and we don't want to use the
* //auto padding, we set final to TRUE
* che_process(&che_context, CHE_DES, CHE_ECB , CHE_ENC, src_buffer, dst_buffer, src_len, KAL_FALSE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_context);
* </code>
* 3. AES Encryption (Counter mode):
* Because this mode doesn't need padding, we don't care the "final" parameter in this mode.
* Its input data can not in block boundary size.
* <code>
* STCHE che_cntx;
* che_init(&che_cntx, CHE_AES);
* che_key_action(&che_cntx, CHE_SET_KEY, key, 16);
* che_set_iv(&che_cntx, iv, 16);
* che_process(&che_cntx, CHE_AES, CHE_CTR, CHE_ENC, src_data, dst_data, src_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_cntx);
* </code>
*
* 4. AES Encryption (Key WRAP mode):
* The input data has to be in multiple of 64 bits block size.
* Because this mode doesn't need padding, we don't care the "final" parameter in this mode.
* Because one more block is generated for checking in KEY WRAP mode,
* the input and output buffer should be different one in KEY_WRAP and KEY_UNWRAP mode.
* <code>
* STCHE che_cntx;
* che_init(&che_cntx, CHE_AES);
* che_key_action(&che_cntx, CHE_SET_KEY, key, 16);
* che_set_iv(&che_cntx, iv, 16);
* che_process(&che_cntx, CHE_AES, CHE_KEY_WRAP, CHE_ENC, src_data, dst_data, src_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_cntx);
* </code>
*
* 5. AES Encryption (CBC mode):
* The input and initial vector address have to be in 4-byte alignment.
*
* With auto padding:
* <code>
* STCHE che_cntx;
* che_init(&che_cntx, CHE_AES);
* che_key_action(&che_cntx, CHE_SET_KEY, key, 16);
* che_set_iv(&che_cntx, iv, 16);
* che_process(&che_cntx, CHE_AES, CHE_CBC, CHE_ENC, src_data, dst_data, src_len, KAL_FALSE);
* //final block
* che_process(&che_cntx, CHE_AES, CHE_CBC, CHE_ENC, src_data, dst_data, src_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_cntx);
* </code>
*
* Without auto padding:
* <code>
* STCHE che_cntx;
* che_init(&che_cntx, CHE_AES);
* che_key_action(&che_cntx, CHE_SET_KEY, key, 16);
* che_set_iv(&che_cntx, iv, 16);
* che_process(&che_cntx, CHE_AES, CHE_CBC, CHE_ENC, src_data, dst_data, src_len, KAL_FALSE);
* // final block
* che_process(&che_cntx, CHE_AES, CHE_CBC, CHE_ENC, src_data, dst_data, src_len, KAL_FALSE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_cntx);
* </code>
* 6. AES Encryption (ECB mode):
* The input address have to be in 4-byte alignment.
*
* With auto padding:
* <code>
* STCHE che_cntx;
* che_init(&che_cntx, CHE_AES);
* che_key_action(&che_cntx, CHE_SET_KEY, key, 16);
* che_process(&che_cntx, CHE_AES, CHE_ECB, CHE_ENC, src_data, dst_data, src_len, KAL_FALSE);
* //final block
* che_process(&che_cntx, CHE_AES, CHE_ECB, CHE_ENC, src_data, dst_data, src_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_cntx);
* </code>
*
* Without auto padding:
* <code>
* STCHE che_cntx;
* che_init(&che_cntx, CHE_AES);
* che_key_action(&che_cntx, CHE_SET_KEY, key, 16);
* che_process(&che_cntx, CHE_AES, CHE_ECB, CHE_ENC, src_data, dst_data, src_len, KAL_FALSE);
* //final block
* che_process(&che_cntx, CHE_AES, CHE_ECB, CHE_ENC, src_data, dst_data, src_len, KAL_FALSE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_cntx);
* </code>
*
* Symmetry Stream Cipher Example:
*
* 1. RC4 Encryption:
* Because this mode doesn't need padding, we don't care the "final" parameter in this mode.
*
* Use default RC4 mode:
* <code>
* STCHE che_ctx;
* che_init(&che_ctx, CHE_RC4);
* che_key_action(&che_ctx, CHE_SET_KEY, (kal_uint8 *)key, key_len);
* che_process(&che_ctx, CHE_RC4, CHE_MODE_NULL, CHE_ENC, (kal_uint8 *)input,
* (kal_uint8 *)output, (kal_int32)input_size, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_ctx);
* </code>
*
* Use CHE_SKIP mode:
* skip the first 256 byts key data because first 256 bytes are not random enough.
* <code>
* STCHE che_ctx;
* che_init(&che_ctx, CHE_RC4);
* che_key_action(&che_ctx, CHE_SET_KEY, (kal_uint8 *)key, key_len);
* che_process(&che_ctx, CHE_RC4, CHE_SKIP, CHE_ENC, (kal_uint8 *)input,
* (kal_uint8 *)output, (kal_int32)input_size, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all cipher operation is finish
* che_deinit(&che_ctx);
* </code>
*
* Hash Operation:
*
* 1. MD5 Hash generation:
* we have to set the final block to TRUE for hash operation. The mode field is useless for hash algorithm.
* HASH doesn't have any mode options. Thus, we set it to CHE_MODE_NULL.
*
* <code>
* STCHE che_context;
* kal_uint8 digest[16];
* che_init(&che_context, CHE_MD5);
* che_process(&che_context,CHE_MD5,CHE_MODE_NULL,CHE_HASH,(kal_uint8*)input,digest,input_len, KAL_FALSE);
* ...
* che_process(&che_context,CHE_MD5,CHE_MODE_NULL,CHE_HASH,(kal_uint8*)input,digest,input_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all hash operation is finish
* che_deinit(&che_context);
* </code>
*
* 2. SHA1 Hash generation:
* we have to set the final block to TRUE for hash operation. The mode field is useless for hash algorithm.
* HASH doesn't have any mode options. Thus, we set it to CHE_MODE_NULL.
*
* <code>
* STCHE che_context;
* kal_uint8 digest[20];
* che_init(&che_context, CHE_SHA1);
* che_process(&che_context,CHE_SHA1,CHE_MODE_NULL,CHE_HASH,(kal_uint8*)input,digest,input_len, KAL_FALSE);
* ...
* che_process(&che_context,CHE_SHA1,CHE_MODE_NULL,CHE_HASH,(kal_uint8*)input,digest,input_len, KAL_TRUE);
* che_deinit(&che_context);
* // do other operation
* ...
* //Deinitialize when all hash operation is finish
* </code>
*
* 3. HMAC MD5 generation:
* we have to set the final block to TRUE for HMAC operation because HMAC doesn't have padding consideartion for last block.
* The mode field is useless for HMAC algorithm. HMAC doesn't have any mode options. Thus, we set it to CHE_MODE_NULL.
*
* <code>
* STCHE che_context;
* kal_uint8 digest[16];
* che_init(&che_context, CHE_MAC_MD5);
* che_key_action(&che_context, CHE_SET_KEY, (kal_uint8 *) key, key_len);
* che_process(&che_context, CHE_MAC_MD5, CHE_MODE_NULL, CHE_HASH, (kal_uint8 *) input, digest, input_len, KAL_FALSE);
* ...
* che_process(&che_context, CHE_MAC_MD5, CHE_MODE_NULL, CHE_HASH, (kal_uint8 *) input, digest, input_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all hash operation is finish
* che_deinit(&che_context);
* </code>
*
* 4. SHA2 Hash generation:
* we have to set the final block to TRUE for hash operation. The mode field is useless for hash algorithm.
* HASH doesn't have any mode options. Thus, we set it to CHE_MODE_NULL.
*
* <code>
* STCHE che_context;
* kal_uint8 digest[32];
* che_init(&che_context, CHE_SHA256);
* che_process(&che_context, CHE_SHA256, CHE_MODE_NULL, CHE_HASH, (kal_uint8 *) input, digest, input_len, KAL_FALSE);
* ...
* che_process(&che_context, CHE_SHA256, CHE_MODE_NULL, CHE_HASH, (kal_uint8 *) input, digest, input_len, KAL_TRUE);
* // do other operation
* ...
* //Deinitialize when all hash operation is finish
* che_deinit(&che_context);
* </code>
*
* Public Key or Key Agreement:
*
* 1. Diffie-Hellman:
* The source and dest parameter is useless for DH.
* The output data is get through che_key_action.
* <code>
* STCHE che_ctx_dh;
* kal_uint32 dh_secret_len;
* kal_uint8 *dh_secret_key = NULL;
*
* che_init(&che_ctx_dh, CHE_DH);
* che_process(&che_ctx_dh, CHE_DH, CHE_MODE_NULL, DH_INIT, NULL, NULL, 0, KAL_TRUE);
* // set the p and g. p and g must in binary format
* che_key_action(&che_ctx_dh, CHE_SET_DH_P, (kal_uint8*) P, P_Len);
* che_key_action(&che_ctx_dh, CHE_SET_DH_G, G, G_Len);
* // Compute self public B = (g^b mod p) and private (b)
* che_process(&che_ctx_dh, CHE_DH, CHE_MODE_NULL, DH_MAKE_PARAMS, NULL, NULL, 0, KAL_TRUE);
* // Set the peer public key (A) in binary format
* che_key_action(&che_ctx_dh, CHE_SET_DH_PEER_PUBLIC, (kal_uint8*)peer_public, peer_public_len);
* // calculate the shared secret: K
* che_process(&che_ctx_dh, CHE_DH, CHE_MODE_NULL, DH_CALC_SECRET, NULL, NULL, 0, KAL_TRUE);
* //get the shared secret key
* che_key_action(&che_ctx_dh, CHE_GET_DH_SECRET_LEN, (void*)&dh_secret_len, sizeof(int));
* dh_secret_key = malloc(dh_secret_len);
* che_key_action(&che_ctx_dh, CHE_GET_DH_SECRET, (kal_uint8*) dh_secret_key, dh_secret_len);
* //call deinit when all operations are finish
* che_process(&che_ctx_dh, CHE_DH, CHE_MODE_NULL, DH_FREE, NULL, NULL, 0, KAL_TRUE);
* che_deinit(&che_ctx_dh);
* </code>
*****************************************************************************/
#define che_process(che_context, type, mode, act, source, dest, source_length, final) \
\
((void)TRICK_##type, run_##type##_process(che_context, type, mode, act, source, dest, source_length, final, 0))
#define che_AES_process(che_context, type, mode, act, source, dest, source_length, final, aes_param) \
\
((void)TRICK_##type, run_##type##_process(che_context, type, mode, act, source, dest, source_length, final, 0, aes_param))
/*****************************************************************************
* DESCRIPTION
* API used to do the CHE computation. The input message is from the "file".
* The usage is the same as che_process except the source of input data.
* For detail algorithm usage, please also take the reference of "che_process"
* PARAMETERS
* che_context : [IN] che context
* type : [IN] che type (CHE_TYPE)
* mode : [IN] che operation mode (CHE_OPERATION_MODE)
* act : [IN] che action (CHE_ACTION)
* pstFSAL : [IN] source file handler
* dest : [OUT] destination buffer (it has to be 4-byte alignment for DES)
* RETURN VALUES
* KAL_TRUE : CHE process successful
* KAL_FLASE : CHE process fail
* SEE ALSO
* che_process
* EXAMPLE
* 1. DES Encryption (CBC mode):
* The initial vector and destination address have to be in 4-byte alignment.
*
* <code>
* STFSAL pstFSAL;
* kal_uint8 pbBuf[512];
* STCHE che_str;
* che_init(&che_str, CHE_DES);
* che_key_action(&che_str, CHE_SET_KEY, key, key_length);
* che_set_iv(&che_str, init_vector, vec_length);
* FSAL_Open(&pstFSAL, body_data_filepath, FSAL_READ);
* FSAL_SetBuffer(&pstFSAL, 512, pbBuf);
* if (che_process_from_file(&che_str, CHE_DES, CHE_CBC, CHE_ENC,
* &pstFSAL, dst_buf) == KAL_FALSE)
* {
* FSAL_Close(&pstFSAL);
* che_deinit(&che_str);
* return ERROR;
* }
* ...
* FSAL_Close(&pstFSAL);
* // do other operations
* ...
* //Deinitialize when all operations are finish
* che_deinit(&che_str);
* </code>
*
* 2. DES Encryption (ECB mode):
* <code>
* STFSAL pstFSAL;
* kal_uint8 pbBuf[512];
* STCHE che_str;
* che_init(&che_str, CHE_DES);
* che_key_action(&che_str, CHE_SET_KEY, key, key_length);
* FSAL_Open(&pstFSAL, body_data_filepath, FSAL_READ);
* FSAL_SetBuffer(&pstFSAL, 512, pbBuf);
* if (che_process_from_file(&che_str, CHE_DES, CHE_ECB, CHE_ENC,
* &pstFSAL, dst_buf) == KAL_FALSE)
* {
* FSAL_Close(&pstFSAL);
* che_deinit(&che_str);
* return ERROR;
* }
* ...
* FSAL_Close(&pstFSAL);
* // do other operations
* ...
* //Deinitialize when all operations are finish
* che_deinit(&che_str);
* </code>
*
* 3. AES Encryption (CBC mode):
* <code>
* STFSAL pstFSAL;
* kal_uint8 pbBuf[512];
* STCHE che_str;
* che_init(&che_str, CHE_AES);
* che_key_action(&che_str, CHE_SET_KEY, key, key_length);
* che_set_iv(&che_str, init_vector, vec_length);
* FSAL_Open(&pstFSAL, body_data_filepath, FSAL_READ);
* FSAL_SetBuffer(&pstFSAL, 512, pbBuf);
* if (che_process_from_file(&che_str, CHE_AES, CHE_CBC, CHE_ENC,
* &pstFSAL, dst_buf) == KAL_FALSE)
* {
* FSAL_Close(&pstFSAL);
* che_deinit(&che_str);
* return ERROR;
* }
* ...
* FSAL_Close(&pstFSAL);
* // do other operations
* ...
* //Deinitialize when all operations are finish
* che_deinit(&che_str);
* </code>
*
* 4. MD5 Hash generation:
* <code>
* STFSAL pstFSAL;
* kal_uint8 pbBuf[512];
* STCHE che_str;
* kal_uint8 digest[16];
* che_init(&che_str, CHE_MD5);
* FSAL_Open(&pstFSAL, body_data_filepath, FSAL_READ);
* FSAL_SetBuffer(&pstFSAL, 512, pbBuf);
* if (che_process_from_file(&che_str, CHE_MD5, CHE_MODE_NULL, CHE_HASH,
* &pstFSAL, digest) == KAL_FALSE)
* {
* FSAL_Close(&pstFSAL);
* che_deinit(&che_str);
* return ERROR;
* }
* ...
* FSAL_Close(&pstFSAL);
* // do other operations
* ...
* //Deinitialize when all operations are finish
* che_deinit(&che_str);
* </code>
*
* 5. HMAC MD5 generation:
* <code>
* STFSAL pstFSAL;
* kal_uint8 pbBuf[512];
* STCHE che_str;
* kal_uint8 digest[16];
* che_init(&che_str, CHE_MAC_MD5);
* che_key_action(&che_context, CHE_SET_KEY, (kal_uint8 *) key, key_len);
* FSAL_Open(&pstFSAL, body_data_filepath, FSAL_READ);
* FSAL_SetBuffer(&pstFSAL, 512, pbBuf);
* if (che_process_from_file(&che_str, CHE_MAC_MD5, CHE_MODE_NULL, CHE_HASH,
* &pstFSAL, digest) == KAL_FALSE)
* {
* FSAL_Close(&pstFSAL);
* che_deinit(&che_str);
* return ERROR;
* }
* ...
* FSAL_Close(&pstFSAL);
* // do other operations
* ...
* //Deinitialize when all operations are finish
* che_deinit(&che_str);
* </code>
*
* 6. Diffie-Hellman: (key = (G^Y)^X mod P)
* get the discrete logarithms (X) and compute self public value (G^X mod P)
* <code>
* STFSAL pstFSAL;
* kal_uint8 pbBuf[512];
* STCHE che_str;
* che_init(&che_str, CHE_DH);
* che_process(&che_ctx_dh, CHE_DH, CHE_MODE_NULL, DH_INIT, NULL, NULL, 0, KAL_TRUE);
* // set the P and G that P and G must in binary format
* che_key_action(&che_ctx_dh, CHE_SET_DH_P, (kal_uint8*) P, P_Len);
* che_key_action(&che_ctx_dh, CHE_SET_DH_G, G, G_Len);
* // make self public (G^X mod P) and private (X)
* che_process(&che_ctx_dh, CHE_DH, CHE_MODE_NULL, DH_MAKE_PARAMS, NULL, NULL, 0, KAL_TRUE);
* // get the self public
* che_key_action(&che_ctx_dh, CHE_GET_DH_SELF_PUBLIC_LEN, (void*)&self_public_len, sizeof(int));
* // get the self public
* *self_private = malloc(self_private_len);
* che_key_action(&che_ctx_dh, CHE_GET_DH_PRIVATE, (kal_uint8*) (*priv)->v, dh_private_len);
* FSAL_Open(&pstFSAL, body_data_filepath, FSAL_READ);
* FSAL_SetBuffer(&pstFSAL, 512, pbBuf);
* if (che_process_from_file(&che_str, CHE_MD5, CHE_MODE_NULL, CHE_ENC,
* &pstFSAL, digest) == KAL_FALSE)
* {
* FSAL_Close(&pstFSAL);
* che_deinit(&che_str);
* return ERROR;
* }
* ...
* FSAL_Close(&pstFSAL);
* // do other operations
* ...
* //Deinitialize when all operations are finish
* che_deinit(&che_str);
* </code>
*****************************************************************************/
#define che_process_from_file(che_context, type, mode, act, pstFSAL, dest) \
\
((void)TRICK_##type, run_##type##_process(che_context, type, mode, act, 0, dest, 0, 0, pstFSAL))
/*****************************************************************************
* FUNCTION
* che_duplicate
* DESCRIPTION
* Duplicate the CHE structure and current content.
* This API only supports CHE_MD5, CHE_SHA1, CHE_MD4, CHE_MAC_MD5, CHE_MAC_SHA1.
* The situation application may encounter and wish to use this API:
* packet1
* Step 1: A -------------------------> B (B receives packet1 and generates the hash value)
* packet2
* Step 2: A -------------------------> B (B receives another packet2 and generates the hash value again)
*
* In this case, application may wish the result of step 2 is the continue of step 1.
* To fulfill user's need, we provide this API for user to store the temporary CHE cotext for
* later use.
* PARAMETERS
* src_che_context : [IN] source CHE context
* dst_che_context : [IN] destination CHE context
*
* RETURN VALUES
* KAL_TRUE : success
* KAL_FALSE : fail
* EXAMPLE
* <code>
* STCHE dst_context;
* che_duplicate(&dst_context, &src_context);
* </code>
*****************************************************************************/
extern kal_bool che_duplicate(STCHE *src_che_context, STCHE *dst_che_context);
/*****************************************************************************
* FUNCTION
* che_exc_support_algo
* DESCRIPTION
* Support which algorithm for exception flow (used by che_calculate_exc_ext)
*
* PARAMETERS
* type [IN]
* RETURNS
* kal_bool - KAL_TRUE for support, KAL_FALSE - not support
*****************************************************************************/
extern kal_bool che_exc_support_algo(kal_uint32 type);
/*****************************************************************************
* FUNCTION
* che_calculate_exc_ext
* DESCRIPTION
* Execute algorithm function for exception flow & normal flow (only support MD5 & HMAC SHA256)
*
* PARAMETERS
* type [IN]
* mode [IN]
* act [IN]
* key [IN]
* key_len [IN]
* source [IN]
* source_length [IN]
* dest [OUT]
* dest_length [OUT]
* RETURNS
* CHE_CALCULATE_ERROR - error code
*****************************************************************************/
extern CHE_CALCULATE_ERROR che_calculate_exc_ext(
CHE_TYPE type,
CHE_OPERATION_MODE mode,
CHE_ACTION act,
kal_uint8 *key,
kal_uint32 key_len,
kal_uint8 *source,
kal_uint32 source_length,
kal_uint8 *dest,
kal_uint32 *dest_length);
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
extern void SST_SSF_Init(void);
extern void SST_SSF_Deinit(void);
extern int Base64encode(char *encoded, const char *string, int len);
extern int Base64decode(char *bufplain, const char *bufcoded);
#endif /* _CHE_API_H */
/*
* ! \page page3 Reference
*
* 1) FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION U.S. DEPARTMENT OF COMMERCE/national Institute of Standards and Technology 46-3 : DATA ENCRYPTION STANDARD (DES)\n
* 2) FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION 197 : ADVANCED ENCRYPTION STANDARD (AES)\n
* 3) FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION 180-2 SECURE HASH STANDARD (SHA)\n
* 4) MIT Laboratory for Computer Science and RSA Data Security, Inc. : The MD5 Message-Digest Algorithm\n
*
*/