/* ****************************************************************************** * INTERPEAK SOURCE FILE * * Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipfreescale_ipsec.c,v $ $Revision: 1.21.10.1 $ * $Source: /home/interpeak/CVSRoot/ipfreescale/src/ipfreescale_ipsec.c,v $ * $Author: svc-cmnet $ * $State: Exp $ $Locker: $ * * INTERPEAK_COPYRIGHT_STRING * Design and implementation by Markus Carlstedt ****************************************************************************** */ /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ #include "ipfreescale_config.h" #ifdef IPIPSEC2 /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #define IPCOM_USE_CLIB_PROTO #include #include #include #include #include #include /* TODO: Not pretty! Nasty dependencies between files */ /* Include ipfreescale_sec4.h before iphwcrypto.h to avoid type collition for uint32_t between stdint.h and ipipsec_pfkeyv2.h */ #ifdef IPFREESCALE_SEC4 #define IPIPSEC_HAVE_UINT_TYPE #endif #if defined(IPFREESCALE_SEC2) || defined(IPFREESCALE_SEC4) #include "ipfreescale_sec.h" #endif #include #include "ipfreescale.h" #include "ipfreescale_h.h" #ifdef IPFREESCALE_COLDFIRE #include "ipfreescale_coldfire.h" #endif /* **************************************************************************** * 4 DEFINES **************************************************************************** */ /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* **************************************************************************** * 6 EXTERN PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 7 LOCAL PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 8 DATA **************************************************************************** */ /* **************************************************************************** * 9 STATIC FUNCTIONS **************************************************************************** */ /* **************************************************************************** * 10 GLOBAL FUNCTIONS **************************************************************************** */ /* *=========================================================================== * ipfreescale_ipsec_esp_null_md5_input *=========================================================================== * Description: IPSEC ESP input processing using NULL-MD5. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_null_md5_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)param; (void)pkt; return ipfreescale_md5_hmac(data, length - sa->authlen, sa->akey, sa->akeylen, digest); } /* *=========================================================================== * ipfreescale_ipsec_esp_null_md5_output *=========================================================================== * Description: IPSEC ESP output processing using NULL-MD5. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_null_md5_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)param; (void)pkt; return ipfreescale_md5_hmac(data, length, sa->akey, sa->akeylen, digest); } /* *=========================================================================== * ipfreescale_ipsec_esp_null_sha1_input *=========================================================================== * Description: IPSEC ESP input processing using NULL-SHA1. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_null_sha1_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)param; (void)pkt; return ipfreescale_sha1_hmac(data, length - sa->authlen, sa->akey, sa->akeylen, digest); } /* *=========================================================================== * ipfreescale_ipsec_esp_null_sha1_output *=========================================================================== * Description: IPSEC ESP output processing using NULL-SHA1. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_null_sha1_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)param; (void)pkt; return ipfreescale_sha1_hmac(data, length, sa->akey, sa->akeylen, digest); } /* *=========================================================================== * ipfreescale_ipsec_esp_des_cbc_null_input *=========================================================================== * Description: IPSEC ESP input processing using DES-CBC-NULL. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_null_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)digest; (void)param; (void)pkt; return ipfreescale_des_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen - sa->authlen, sa->ekey, data + sa->hdrlen - sa->ivlen, 0); } /* *=========================================================================== * ipfreescale_ipsec_esp_des_cbc_null_output *=========================================================================== * Description: IPSEC ESP output processing using DES-CBC-NULL. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_null_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { Ip_u8 iv[IPFREESCALE_DES_IV_SIZE]; ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)digest; (void)param; (void)pkt; ipcom_memcpy(iv, sa->iv, IPFREESCALE_DES_IV_SIZE); return ipfreescale_des_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen, sa->ekey, iv, 1); } /* *=========================================================================== * ipfreescale_ipsec_esp_des_cbc_md5_input *=========================================================================== * Description: IPSEC ESP input processing using DES-CBC-MD5. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_md5_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_des_cbc_md5_input_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_md5_input_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_input(DPD_IPSEC_CBC_SDES_DECRYPT_MD5_PAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_input(IPFREESCALE_COLDFIRE_ESP_DECRYPT_DES_CBC_MD5, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_des_cbc_md5_output *=========================================================================== * Description: IPSEC ESP output processing using DES-CBC-MD5. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_md5_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_des_cbc_md5_output_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_md5_output_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_output(DPD_IPSEC_CBC_SDES_ENCRYPT_MD5_PAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_output(IPFREESCALE_COLDFIRE_ESP_ENCRYPT_DES_CBC_MD5, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_des_cbc_sha1_input *=========================================================================== * Description: IPSEC ESP input processing using DES-CBC-SHA1. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_sha1_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_des_cbc_sha1_input_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_sha1_input_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_input(DPD_IPSEC_CBC_SDES_DECRYPT_SHA_PAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_input(IPFREESCALE_COLDFIRE_ESP_DECRYPT_DES_CBC_SHA1, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_des_cbc_sha1_output *=========================================================================== * Description: IPSEC ESP output processing using DES-CBC-SHA1. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_sha1_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_des_cbc_sha1_output_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_des_cbc_sha1_output_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_output(DPD_IPSEC_CBC_SDES_ENCRYPT_SHA_PAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_output(IPFREESCALE_COLDFIRE_ESP_ENCRYPT_DES_CBC_SHA1, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_3des_cbc_null_input *=========================================================================== * Description: IPSEC ESP input processing using 3DES-CBC-NULL. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_null_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)digest; (void)param; (void)pkt; return ipfreescale_3des_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen - sa->authlen, sa->ekey, data + sa->hdrlen - sa->ivlen, 0); } /* *=========================================================================== * ipfreescale_ipsec_esp_3des_cbc_null_output *=========================================================================== * Description: IPSEC ESP output processing using 3DES-CBC-NULL. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_null_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { Ip_u8 iv[IPFREESCALE_DES_IV_SIZE]; ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)digest; (void)param; (void)pkt; ipcom_memcpy(iv, sa->iv, IPFREESCALE_DES_IV_SIZE); return ipfreescale_3des_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen, sa->ekey, iv, 1); } /* *=========================================================================== * ipfreescale_ipsec_esp_3des_cbc_md5_input *=========================================================================== * Description: IPSEC ESP input processing using 3DES-CBC-MD5. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_md5_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_3des_cbc_md5_input_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_md5_input_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_input(DPD_IPSEC_CBC_TDES_DECRYPT_MD5_PAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_input(IPFREESCALE_COLDFIRE_ESP_DECRYPT_3DES_CBC_MD5, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_3des_cbc_md5_output *=========================================================================== * Description: IPSEC ESP output processing using 3DES-CBC-MD5. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_md5_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_3des_cbc_md5_output_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_md5_output_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) /* Used to place crypto output at other location than input */ /* ipcom_printf("ipfreescale_ipsec_esp_3des_cbc_md5_output: data=0x%x, length=%d, outdata=0x%x, sa=0x%x, digest=0x%x, param=0x%x, pkt=0x%x\n",data, length, outdata, sa, digest, param, pkt);*/ return ipfreescale_ipsec_sec_esp_output(DPD_IPSEC_CBC_TDES_ENCRYPT_MD5_PAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_output(IPFREESCALE_COLDFIRE_ESP_ENCRYPT_3DES_CBC_MD5, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_3des_cbc_sha1_input *=========================================================================== * Description: IPSEC ESP input processing using 3DES-CBC-SHA1. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_sha1_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_3des_cbc_sha1_input_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_sha1_input_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_input(DPD_IPSEC_CBC_TDES_DECRYPT_SHA_PAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_input(IPFREESCALE_COLDFIRE_ESP_DECRYPT_3DES_CBC_SHA1, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_3des_cbc_sha1_output *=========================================================================== * Description: IPSEC ESP output processing using 3DES-CBC-SHA1. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_sha1_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_3des_cbc_sha1_output_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_3des_cbc_sha1_output_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_output(DPD_IPSEC_CBC_TDES_ENCRYPT_SHA_PAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_output(IPFREESCALE_COLDFIRE_ESP_ENCRYPT_3DES_CBC_SHA1, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_aes_cbc_null_input *=========================================================================== * Description: IPSEC ESP input processing using AES-CBC-NULL. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_null_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)digest; (void)param; (void)pkt; if (sa->ekeylen == 16) return ipfreescale_aes128_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen - sa->authlen, sa->ekey, data + sa->hdrlen - sa->ivlen, 0); else if (sa->ekeylen == 24) return ipfreescale_aes192_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen - sa->authlen, sa->ekey, data + sa->hdrlen - sa->ivlen, 0); else if (sa->ekeylen == 32) return ipfreescale_aes256_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen - sa->authlen, sa->ekey, data + sa->hdrlen - sa->ivlen, 0); else return -1; } /* *=========================================================================== * ipfreescale_ipsec_esp_aes_cbc_null_output *=========================================================================== * Description: IPSEC ESP output processing using AES-CBC-NULL. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_null_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { Ip_u8 iv[IPFREESCALE_AES_IV_SIZE]; ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; (void)digest; (void)param; (void)pkt; ipcom_memcpy(iv, sa->iv, IPFREESCALE_AES_IV_SIZE); if (sa->ekeylen == 16) return ipfreescale_aes128_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen, sa->ekey, iv, 1); else if (sa->ekeylen == 24) return ipfreescale_aes192_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen, sa->ekey, iv, 1); else if (sa->ekeylen == 32) return ipfreescale_aes256_cbc_cipher(data + sa->hdrlen, data + sa->hdrlen, length - sa->hdrlen, sa->ekey, iv, 1); else return -1; } /* *=========================================================================== * ipfreescale_ipsec_esp_aes_cbc_md5_input *=========================================================================== * Description: IPSEC ESP input processing using AES-CBC-MD5. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_md5_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_aes_cbc_md5_input_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_md5_input_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_input(DPD_IPSEC_AES_CBC_DECRYPT_MD5_APAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_input(IPFREESCALE_COLDFIRE_ESP_DECRYPT_AES_CBC_MD5, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_aes_cbc_md5_output *=========================================================================== * Description: IPSEC ESP output processing using AES-CBC-MD5. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_md5_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_aes_cbc_md5_output_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_md5_output_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_output(DPD_IPSEC_AES_CBC_ENCRYPT_MD5_APAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_output(IPFREESCALE_COLDFIRE_ESP_ENCRYPT_AES_CBC_MD5, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_aes_cbc_sha1_input *=========================================================================== * Description: IPSEC ESP input processing using AES-CBC-SHA1. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_sha1_input(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_aes_cbc_sha1_input_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_sha1_input_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_input(DPD_IPSEC_AES_CBC_DECRYPT_SHA_APAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_input(IPFREESCALE_COLDFIRE_ESP_DECRYPT_AES_CBC_SHA1, data, length, sa, digest, param, pkt); #endif } /* *=========================================================================== * ipfreescale_ipsec_esp_aes_cbc_sha1_output *=========================================================================== * Description: IPSEC ESP output processing using AES-CBC-SHA1. * Parameters: data - pointer to the packet data. * length - length of the packet. * sa - pointer to the sa (tunnel descriptor block). * param - pointer to ipsec parameters. * digest - pointer the message autentication code. * pkt - pointer to the packet structure. * Returns: 2 = kept * 1 = ok * 0 = timeout * -1 = error */ IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_sha1_output(Ip_u8 *data, Ip_u32 length, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { return ipfreescale_ipsec_esp_aes_cbc_sha1_output_relocate(data, length, data, sa, digest, param, pkt); } IP_PUBLIC int ipfreescale_ipsec_esp_aes_cbc_sha1_output_relocate(Ip_u8 *data, Ip_u32 length, Ip_u8 *outdata, Iphwcrypto_esp_cbc_sa *sa, Ip_u8 *digest, Ipipsec_param *param, Ipcom_pkt *pkt) { ip_assert(length <= IPFREESCALE_CRYPTO_BUFSIZE); if(length > IPFREESCALE_CRYPTO_BUFSIZE) return -1; #if defined(IPFREESCALE_SEC2) || defined (IPFREESCALE_SEC4) return ipfreescale_ipsec_sec_esp_output(DPD_IPSEC_AES_CBC_ENCRYPT_SHA_APAD, data, length, outdata, sa, digest, param, pkt); #endif #ifdef IPFREESCALE_COLDFIRE return ipfreescale_ipsec_coldfire_esp_output(IPFREESCALE_COLDFIRE_ESP_ENCRYPT_AES_CBC_SHA1, data, length, sa, digest, param, pkt); #endif } /* **************************************************************************** * 11 PUBLIC FUNCTIONS **************************************************************************** */ #else int ipfreescale_ipsec_empty_file; #endif /* #ifdef IPIPSEC2 */ /* **************************************************************************** * END OF FILE **************************************************************************** */