00001 #ifndef _SALLD_H
00002 #define _SALLD_H
00003
00004
00082 #ifdef __cplusplus
00083 extern "C" {
00084 #endif
00085
00086
00087 #include <stdint.h>
00088 #include <stdlib.h>
00089 #include <string.h>
00090
00091 #include <ti/drv/sa/saver.h>
00092
00093
00094
00131 #define sa_DBG_INFORMATIONAL 0
00132
00136 #define sa_DBG_WARNING 1
00137
00142 #define sa_DBG_FATAL_ERROR 2
00143
00160 #define sa_MSG_NO_MKI_LEN_CHANGE_ON_FLY 1
00161
00165 #define sa_MSG_MKI_LEN_IS_ZERO 2
00166
00183 #define sa_STATE_RESET 0
00189 #define sa_STATE_ENABLE 1
00195 #define sa_STATE_QUERY 2
00201 #define sa_STATE_INCONSISTENT 3
00207 #define sa_STATE_INVALID_REQUEST 4
00213 #define sa_STATE_ENABLE_FAILED 5
00218 #define sa_STATE_INVALID 6
00231 typedef int Sa_State_t;
00232
00247 #define sa_ERR_OK 0
00248
00252 #define sa_ERR_GEN -1
00253
00257 #define sa_ERR_PARAMS -2
00258
00262 #define sa_ERR_NOMEM -3
00263
00268 #define sa_ERR_INV_BUF -4
00269
00273 #define sa_ERR_INV_PROTO_TYPE -5
00274
00278 #define sa_ERR_NO_CTX_BUF -6
00279
00283 #define sa_ERR_KEY_EXPIRED -7
00284
00288 #define sa_ERR_REPLAY_OLD -8
00289
00293 #define sa_ERR_REPLAY_DUP -9
00294
00298 #define sa_ERR_AUTH_FAIL -10
00299
00303 #define sa_ERR_PADDING_FAIL -11
00304
00308 #define sa_ERR_CLOSE_PENDING -12
00309
00313 #define sa_ERR_UNSUPPORTED -13
00314
00318 #define sa_ERR_STATS_UNAVAIL -14
00319
00323 #define sa_ERR_MODULE_BUSY -15
00324
00328 #define sa_ERR_MODULE_UNAVAIL -16
00329
00333 #define sa_ERR_PKA_TIMEOUT -17
00334
00338 #define sa_ERR_SWINFO_UNAVAIL -18
00339
00343 #define sa_ERR_INV_HANDLE -19
00344
00349 #define sa_ERR_INV_ENDIAN_MODE -20
00350
00354 #define sa_ERR_SCRATCH_MEMORY_FULL -21
00355
00359 #define sa_ERR_INV_INT_MEM -22
00360
00376 typedef enum {
00377 sa_PT_NULL = 0,
00378 sa_PT_SRTP,
00379 sa_PT_SRTCP,
00380 sa_PT_IPSEC_AH,
00381 sa_PT_IPSEC_ESP,
00382 sa_PT_3GPP_AC
00383 } Sa_SecProto_e;
00398 typedef enum {
00399 sa_CipherMode_NULL = 0,
00400 sa_CipherMode_AES_CTR,
00401 sa_CipherMode_AES_F8,
00402 sa_CipherMode_AES_CBC,
00403 sa_CipherMode_DES_CBC,
00404 sa_CipherMode_3DES_CBC,
00405 sa_CipherMode_CCM,
00406 sa_CipherMode_GCM,
00407 sa_CipherMode_GSM_A53,
00408 sa_CipherMode_ECSD_A53,
00409 sa_CipherMode_GEA3,
00410 sa_CipherMode_KASUMI_F8,
00411 sa_CipherMode_SNOW3G_F8,
00412 sa_CipherMode_LAST
00413 } Sa_CipherMode_e;
00426 typedef enum {
00427 sa_AuthMode_NULL = 0,
00428 sa_AuthMode_MD5 = sa_CipherMode_LAST,
00429 sa_AuthMode_SHA1,
00430 sa_AuthMode_SHA2_224,
00431 sa_AuthMode_SHA2_256,
00432 sa_AuthMode_HMAC_MD5,
00433 sa_AuthMode_HMAC_SHA1,
00434 sa_AuthMode_HMAC_SHA2_224,
00435 sa_AuthMode_HMAC_SHA2_256,
00436 sa_AuthMode_GMAC,
00437 sa_AuthMode_GMAC_AH,
00439 sa_AuthMode_CMAC,
00440 sa_AuthMode_CBC_MAC,
00441 sa_AuthMode_AES_XCBC,
00442 sa_AuthMode_KASUMI_F9
00443 } Sa_AuthMode_e;
00452 typedef void* Sa_ChanHandle;
00453
00471 #define sa_SIZE_CONFIG_CREATE_SHADOW_INST 0x0001
00472
00483 typedef struct {
00484 Sa_SecProto_e protocolType;
00485 int cacheLineSize;
00488 uint16_t ctrlBitMap;
00489 } Sa_ChanSizeCfg_t;
00490
00498 typedef struct {
00499 uint32_t ID;
00500 Sa_ChanSizeCfg_t sizeConfig;
00501 } Sa_ChanConfig_t;
00502
00510 typedef struct {
00511 uint16_t masterKeySize;
00512 uint16_t masterSaltSize;
00513 uint16_t sessionEncKeySize;
00514 uint16_t sessionMacKeySize;
00515 uint16_t sessionSaltSize;
00516 uint16_t macSize;
00517 } Sa_SrtpConfigParams_t;
00518
00530 typedef enum {
00531 sa_IPSEC_TRANSPORT_TRANSPORT = 0,
00532 sa_IPSEC_TRANSPORT_TUNNEL
00533 } Sa_IpsecTransportType_e;
00553 #define sa_IPSEC_CONFIG_ESN 0x0001
00554
00560 #define sa_IPSEC_CONFIG_PERMANENT_SC 0x0002
00561
00571 typedef struct {
00572 uint16_t transportType;
00573 uint16_t ctrlBitMap;
00574 uint16_t encryptionBlockSize;
00579 uint16_t sessionEncKeySize;
00580 uint16_t sessionMacKeySize;
00581 uint16_t sessionSaltSize;
00582 uint16_t ivSize;
00583 uint16_t macSize;
00584 uint16_t nextHdr;
00585 uint32_t spi;
00586 uint32_t esnLo;
00587 uint32_t esnHi;
00588 } Sa_IpsecConfigParams_t;
00589
00604 typedef enum {
00605 sa_AcPduType_GSM = 0,
00606 sa_AcPduType_WCDMA_TMD,
00607 sa_AcPduType_WCDMA_UMD,
00608 sa_AcPduType_WCDMA_AMD,
00609 sa_AcPduType_LTE,
00610 sa_AcPduType_LTE_CP
00611 } Sa_AcPduType_e;
00630 #define sa_AC_CONFIG_BEARER_MASK 0x00FF
00631
00636 #define sa_AC_CONFIG_DIR 0x0100
00637
00642 #define sa_AC_CONFIG_COPY_COUNTC 0x0200
00643
00649 #define sa_AC_CONFIG_KEY_IN_SCRATCH 0x0400
00650
00665 typedef struct {
00666 uint32_t countC;
00672 uint32_t fresh;
00674 uint32_t ivLow26;
00675 uint16_t pduType;
00676 uint16_t ctrlBitMap;
00677 uint16_t sessionEncKeySize;
00679 uint16_t sessionMacKeySize;
00680 uint16_t ivSize;
00681 uint16_t macSize;
00682 } Sa_AcConfigParams_t;
00683
00691 typedef struct {
00692 uint16_t sessionEncKeySize;
00693 uint16_t sessionMacKeySize;
00694 uint16_t sessionSaltSize;
00695 uint16_t ivSize;
00696 uint16_t macSize;
00697 uint16_t aadSize;
00698 uint16_t enc;
00699 uint16_t enc1st;
00700 } Sa_DataModeConfigParams_t;
00701
00709 typedef union {
00710 Sa_SrtpConfigParams_t srtp;
00711 Sa_IpsecConfigParams_t ipsec;
00712 Sa_AcConfigParams_t ac;
00713 Sa_DataModeConfigParams_t data;
00714 } Sa_ProtocolConfigParams_t;
00715
00724 typedef struct {
00725 uint8_t flowID;
00726 uint16_t queueID;
00727 uint32_t swInfo0;
00728 uint32_t swInfo1;
00729 } Sa_DestInfo_t;
00730
00739 typedef struct {
00740 Sa_CipherMode_e cipherMode;
00741 Sa_AuthMode_e authMode;
00742 Sa_DestInfo_t destInfo;
00743 Sa_ProtocolConfigParams_t params;
00744 } Sa_GenConfigParams_t;
00745
00760 #define sa_CONTROLINFO_VALID_CTRL_BITMAP 0x0001
00761
00765 #define sa_CONTROLINFO_VALID_TX_CTRL 0x0002
00766
00770 #define sa_CONTROLINFO_VALID_RX_CTRL 0x0004
00771
00775 #define sa_CONTROLINFO_VALID_REPLAY_WIN 0x0008
00776
00794 #define sa_CONTROLINFO_CTRL_TX_ON 0x0001
00795
00799 #define sa_CONTROLINFO_CTRL_RX_ON 0x0002
00800
00805 #define sa_CONTROLINFO_CTRL_TX_RX_MASK 0x0003
00806
00812 #define sa_CONTROLINFO_CTRL_SW_ONLY 0x0008
00813
00818 #define sa_CONTROLINFO_CTRL_OP_MASK 0x000b
00819
00830 typedef struct {
00831 uint16_t validBitfield;
00832 uint16_t ctrlBitfield;
00834 Sa_GenConfigParams_t txCtrl;
00836 Sa_GenConfigParams_t rxCtrl;
00838 uint16_t replayWindowSize;
00840 } Sa_GenCtrlInfo_t;
00841
00856 #define sa_SRTP_KEY_CTRL_MASTER_KEY 0x0001
00857
00861 #define sa_SRTP_KEY_CTRL_MASTER_SALT 0x0002
00862
00866 #define sa_SRTP_KEY_CTRL_KEY_DERIVE_RATE 0x0004
00867
00871 #define sa_SRTP_KEY_CTRL_KEY_LIFETIME 0x0008
00872
00876 #define sa_SRTP_KEY_CTRL_ROC 0x0010
00877
00882 #define sa_SRTP_KEY_CTRL_MKI 0x0020
00883
00888 #define sa_SRTP_KEY_CTRL_KEY_TYPE_FROM_TO 0x0040
00889
00899 typedef struct {
00900 uint16_t ctrlBitfield;
00901 uint8_t* masterKey;
00902 uint8_t* masterSalt;
00903 uint16_t derivRate;
00905 uint16_t keyLifeTimeMsw;
00907 uint32_t keyLifeTimeLsw;
00909 uint32_t roc;
00911 uint32_t fromEsnMsw;
00913 uint16_t fromEsnLsw;
00915 uint32_t toEsnMsw;
00917 uint16_t toEsnLsw;
00919 uint16_t mkiSize;
00920 uint32_t mki;
00921 } Sa_SrtpKeyParams_t;
00922
00927 #define SALLD_MAX_KEY_SIZE 32
00928
00943 #define sa_IPSEC_KEY_CTRL_ENC_KEY 0x0001
00944
00948 #define sa_IPSEC_KEY_CTRL_MAC_KEY 0x0002
00949
00953 #define sa_IPSEC_KEY_CTRL_SALT 0x0004
00954
00964 typedef struct {
00965 uint16_t ctrlBitfield;
00966 uint8_t* sessionEncKey;
00967 uint8_t* sessionAuthKey;
00968 uint8_t* sessionSalt;
00969 } Sa_IpsecKeyParams_t;
00970
00985 #define sa_AC_KEY_CTRL_ENC_KEY 0x0001
00986
00990 #define sa_AC_KEY_CTRL_MAC_KEY 0x0002
00991
01001 typedef struct {
01002 uint16_t ctrlBitfield;
01003 uint8_t* sessionEncKey;
01004 uint8_t* sessionAuthKey;
01005 } Sa_AcKeyParams_t;
01006
01021 #define sa_DATA_MODE_KEY_CTRL_ENC_KEY 0x0001
01022
01026 #define sa_DATA_MODE_KEY_CTRL_MAC_KEY 0x0002
01027
01031 #define sa_DATA_MODE_KEY_CTRL_SALT 0x0004
01032
01042 typedef struct {
01043 uint16_t ctrlBitfield;
01044 uint8_t* sessionEncKey;
01045 uint8_t* sessionAuthKey;
01046 uint8_t* sessionSalt;
01047 } Sa_DataModeKeyParams_t;
01048
01056 typedef union {
01057 Sa_SrtpKeyParams_t srtp;
01058 Sa_IpsecKeyParams_t ipsec;
01059 Sa_AcKeyParams_t ac;
01060 Sa_DataModeKeyParams_t data;
01061 } Sa_ProtocolKeyParams_t;
01062
01077 #define sa_KEY_CONTROL_TX_KEY_VALID 0x0001
01078
01082 #define sa_KEY_CONTROL_RX_KEY_VALID 0x0002
01083
01094 typedef struct {
01095 uint16_t ctrlBitfield;
01097 Sa_ProtocolKeyParams_t txKey;
01099 Sa_ProtocolKeyParams_t rxKey;
01101 } Sa_KeyCtrlInfo_t;
01102
01115 typedef enum {
01116 sa_CHAN_CTRL_GEN_CONFIG = 1,
01117 sa_CHAN_CTRL_KEY_CONFIG = 2
01118 } Sa_ChanControlCode_e;
01129 typedef struct {
01130 uint16_t ctrlType;
01131 union {
01132 Sa_GenCtrlInfo_t gen;
01133 Sa_KeyCtrlInfo_t key;
01134 }ctrlInfo;
01136 } Sa_ChanCtrlInfo_t;
01137
01152 #define sa_PKT_ERR_OK 0
01153
01157 #define sa_PKT_ERR_REPLAY_OLD 1
01158
01162 #define sa_PKT_ERR_REPLAY_DUP 2
01163
01168 #define sa_PKT_ERR_INVALID_KEY 3
01169
01174 #define sa_PKT_ERR_INVALID_MKI 4
01175
01179 #define sa_PKT_ERR_AUTH_FAIL 5
01180
01190 typedef uint16_t Sa_PktErr_t;
01191
01202 typedef enum {
01203 sa_PKT_DIR_FROM_NETWORK = 0,
01204 sa_PKT_DIR_TO_NETWORK
01205 } Sa_PktDir_t;
01213 #define sa_MAX_SW_INFO_SIZE 3
01214
01224 typedef struct {
01225 uint16_t size;
01226 uint32_t swInfo[sa_MAX_SW_INFO_SIZE];
01227 } Sa_SWInfo_t;
01228
01238 #define sa_SWINFO_UPDATE_DEST_INFO(info, queueID, flowIndex) \
01239 { \
01240 (info[0]) |= 0x40000000L; \
01241 (info[2]) = ((queueID)) | (((flowIndex) & 0xFF) << 16) | ((info[2]) & 0xFF000000L); \
01242 } \
01243
01244
01253 typedef struct {
01254 uint8_t index;
01255 uint8_t offset;
01256 uint8_t size;
01258 } Sa_CmdLbParamInfo_t;
01259
01271 typedef enum {
01272 sa_DM_GEN = 0,
01273 sa_DM_CCM,
01274 sa_DM_GCM,
01275 sa_DM_GMAC,
01276 sa_DM_GMAC_AH
01277 } Sa_DM_subMode_e;
01296 #define sa_CMDL_UPDATE_VALID_ENC 0x0001
01297
01301 #define sa_CMDL_UPDATE_VALID_AUTH 0x0002
01302
01306 #define sa_CMDL_UPDATE_VALID_ENC_IV 0x0004
01307
01311 #define sa_CMDL_UPDATE_VALID_AUTH_IV 0x0008
01312
01316 #define sa_CMDL_UPDATE_VALID_AAD 0x0010
01317
01321 #define sa_CMDL_UPDATE_VALID_AUX_KEY 0x0020
01322
01326 #define sa_CMDL_UPDATE_VALID_PAYLOAD 0x0040
01327
01331 #define sa_CMDL_UPDATE_VALID_ENC_SIZE 0x0080
01332
01336 #define sa_CMDL_UPDATE_VALID_ENC_IV2 0x0100
01337
01341 #define sa_CMDL_UPDATE_VALID_AUTH_SIZE 0x0200
01342
01356 typedef struct {
01357 uint16_t validBitfield;
01358 uint16_t subMode;
01359 Sa_CmdLbParamInfo_t encSizeInfo;
01360 Sa_CmdLbParamInfo_t encSizeInfo2;
01361 Sa_CmdLbParamInfo_t encOffsetInfo;
01362 Sa_CmdLbParamInfo_t encIvInfo;
01363 Sa_CmdLbParamInfo_t encIvInfo2;
01364 Sa_CmdLbParamInfo_t aadInfo;
01365 Sa_CmdLbParamInfo_t payloadInfo;
01366 Sa_CmdLbParamInfo_t authSizeInfo;
01367 Sa_CmdLbParamInfo_t authSizeInfo2;
01368 Sa_CmdLbParamInfo_t authOffsetInfo;
01369 Sa_CmdLbParamInfo_t authIvInfo;
01370 Sa_CmdLbParamInfo_t auxKeyInfo;
01371 uint32_t auxKey[8];
01372 } Sa_CmdLbUpdateInfo_t;
01373
01378 #define sa_MAX_CMDLB_SIZE 96
01379
01393 typedef struct {
01394 uint16_t cmdLbSize;
01395 uint8_t* cmdLbBuf;
01398 Sa_CmdLbUpdateInfo_t* cmdLbUpdateInfo;
01401 } Sa_CmdLabelInfo_t;
01402
01410 typedef struct {
01411 uint8_t encOffset;
01412 uint8_t authOffset;
01413 uint16_t encSize;
01414 uint16_t authSize;
01415 uint8_t* encIV;
01417 uint8_t* authIV;
01418 uint8_t* aad;
01419 } Sa_PayloadInfo_t;
01420
01428 typedef struct {
01429 uint16_t dstPort;
01430 uint16_t srcPort;
01431 } Sa_ipsecNatTInfo_t;
01432
01447 #define sa_PKT_INFO_VALID_PKT_ERR_CODE 0x0001
01448
01452 #define sa_PKT_INFO_VALID_SW_INFO 0x0002
01453
01457 #define sa_PKT_INFO_VALID_CMDLB_INFO 0x0004
01458
01462 #define sa_PKT_INFO_VALID_PAYLOAD_INFO 0x0008
01463
01467 #define sa_PKT_INFO_VALID_IPSEC_NAT_T_INFO 0x0010
01468
01499 typedef struct {
01500 int32_t size;
01501 uint16_t payloadOffset;
01508 uint16_t payloadLen;
01509 uint16_t nSegments;
01510 void** segments;
01511 uint16_t *segUsedSizes;
01512 uint16_t *segAllocSizes;
01513 } Sa_PktDesc_t;
01514
01522 typedef struct {
01523 Sa_PktDesc_t pktDesc;
01524 uint16_t validBitMap;
01525 uint16_t pktErrCode;
01526 Sa_SWInfo_t swInfo;
01527 Sa_CmdLabelInfo_t cmdlb;
01528 Sa_PayloadInfo_t payloadInfo;
01529 Sa_ipsecNatTInfo_t natTInfo;
01530 } Sa_PktInfo_t;
01531
01547 #define sa_SRTP_KEY_REQUEST_KEY_TYPE_MKI 0x0001
01548
01552 #define sa_SRTP_KEY_REQUEST_TX_KEY 0x0002
01553
01557 #define sa_SRTP_KEY_REQUEST_RX_KEY 0x0004
01558
01562 #define sa_SRTP_KEY_REQUEST_MKI_VALID 0x0008
01563
01574 typedef struct {
01575 uint16_t ctrlBitfield;
01577 uint32_t mki;
01578 } Sa_SrtpKeyRequest_t;
01579
01587 typedef struct {
01588 union {
01589 Sa_SrtpKeyRequest_t srtp;
01590 } params;
01591 } Sa_KeyRequest_t;
01592
01644 typedef struct {
01645 uint16_t scSize;
01646 uint16_t scID;
01647 uint8_t* scBuf;
01649 } Sa_ScReqInfo_t;
01650
01655 #define sa_SC_ID_MASK 0x7FFF
01656
01661 #define sa_SC_IND_PERMANENT 0x8000
01662
01663
01673
01674
01679 #define sa_IPSEC_TX_MAX_SC_SIZE 288
01680
01681
01686 #define sa_IPSEC_RX_MAX_SC_SIZE 320
01687
01692 #define sa_SRTP_TX_MAX_SC_SIZE 224
01693
01694
01699 #define sa_SRTP_RX_MAX_SC_SIZE 288
01700
01705 #define sa_AC_MAX_SC_SIZE 288
01706
01711 #define sa_DATA_MODE_MAX_SC_SIZE 256
01712
01717 #define sa_MAX_SC_SIZE 320
01718
01719
01726 #define sa_MAX_REPLAY_WINDOW_SIZE 128
01727
01736 typedef struct Sa_Replay_Cxt_tag
01737 {
01738 uint32_t winMask[sa_MAX_REPLAY_WINDOW_SIZE/32];
01741 uint32_t winBaseHi;
01742 uint32_t winBase;
01744 } Sa_Replay_Cxt_t;
01745
01759 #define sa_STATS_QUERY_FLAG_CLEAR 0x0001
01760
01764 #define sa_STATS_QUERY_FLAG_TRIG 0x0002
01765
01771 #define sa_STATS_QUERY_FLAG_NOW 0x0004
01772
01782 typedef struct {
01783 uint32_t replayOld;
01784 uint32_t replayDup;
01785 uint32_t authFail;
01786 uint32_t txROC;
01787 uint32_t rxROC;
01788 uint16_t txRekey;
01789 uint16_t rxRekey;
01790 uint16_t pktEncHi;
01791 uint32_t pktEncLo;
01792 uint16_t pktDecHi;
01793 uint32_t pktDecLo;
01794 } Sa_SrtpStats_t;
01795
01803 typedef struct {
01804 uint32_t replayOld;
01805 uint32_t replayDup;
01806 uint32_t authFail;
01807 uint16_t txRekey;
01808 uint16_t rxRekey;
01809 uint32_t pktEnc;
01810 uint32_t pktDec;
01811 } Sa_SrtcpStats_t;
01812
01820 typedef struct {
01821 Sa_Replay_Cxt_t replayCxt;
01822 uint32_t replayOld;
01823 uint32_t replayDup;
01824 uint32_t authFail;
01825 uint32_t txRollover;
01826 uint32_t txESN;
01827 uint32_t txSN;
01828 uint32_t rxESN;
01829 uint32_t pktEncHi;
01830 uint32_t pktEncLo;
01831 uint32_t pktDecHi;
01832 uint32_t pktDecLo;
01833 uint32_t txByteCountHi;
01834 uint32_t txByteCountLo;
01835 uint32_t rxByteCountHi;
01836 uint32_t rxByteCountLo;
01837 } Sa_IpsecStats_t;
01838
01846 typedef struct {
01847 uint32_t authFail;
01848 uint32_t toAirCountC;
01849 uint32_t fromAirCountC;
01850 uint32_t pktToAirHi;
01851 uint32_t pktToAirLo;
01852 uint32_t pktFromAirHi;
01853 uint32_t pktFromAirLo;
01854 } Sa_AcStats_t;
01855
01863 typedef struct {
01864 uint32_t pktHi;
01865 uint32_t pktLo;
01866 } Sa_DataModeStats_t;
01867
01875 typedef union {
01876 Sa_SrtpStats_t srtp;
01877 Sa_SrtcpStats_t srtcp;
01878 Sa_IpsecStats_t ipsec;
01879 Sa_AcStats_t ac;
01880 Sa_DataModeStats_t data;
01881 } Sa_Stats_t;
01882
01888 typedef void* Sa_Handle;
01889
01899 typedef struct Sa_CallOutFuns_s {
01900
01911 void (*DebugTrace) (Sa_ChanHandle handle, uint16_t msgType, uint16_t msgCode,
01912 uint16_t msgLength, uint16_t *msgData);
01925 void (*ChanKeyRequest) (Sa_ChanHandle handle, Sa_KeyRequest_t* keyReq);
01926
01938 void (*ScAlloc) (Sa_ChanHandle handle, Sa_ScReqInfo_t* scReqInfo);
01939
01953 void (*ScFree) (Sa_ChanHandle handle, uint16_t scID);
01954
01967 void (*ChanRegister) (Sa_ChanHandle handle, Sa_SWInfo_t* chanSwInfo);
01968
01981 void (*ChanUnRegister) (Sa_ChanHandle handle, Sa_SWInfo_t* chanSwInfo);
01982
01995 void (*ChanSendNullPkt) (Sa_ChanHandle handle, Sa_PktInfo_t *pktInfo);
01996
01997 } Sa_CallOutFuncs_t;
01998
02005 typedef struct {
02006 uint16_t nMaxChan;
02007 int cacheLineSize;
02009 uint16_t ctrlBitMap;
02010 } Sa_SizeCfg_t;
02011
02019 typedef struct {
02020 uint32_t ID;
02021 uint32_t baseAddr;
02022 Sa_CallOutFuncs_t *callTable;
02023 void* intBuf;
02026 Sa_SizeCfg_t *sizeConfig;
02027 void *instPoolBaseAddr;
02029 void *scPoolBaseAddr;
02031 } Sa_Config_t;
02032
02040 typedef struct {
02041 uint32_t replayOld;
02042 uint32_t replayDup;
02043 uint32_t authFail;
02044 uint32_t pktEncHi;
02045 uint32_t pktEncLo;
02046 uint32_t pktDecHi;
02047 uint32_t pktDecLo;
02048 } Sa_SrtpSysStats_t;
02049
02057 typedef struct {
02058 uint32_t replayOld;
02059 uint32_t replayDup;
02060 uint32_t authFail;
02061 uint32_t pktEncHi;
02062 uint32_t pktEncLo;
02063 uint32_t pktDecHi;
02064 uint32_t pktDecLo;
02065 } Sa_IpsecSysStats_t;
02066
02074 typedef struct {
02075 uint32_t authFail;
02076 uint32_t pktToAirHi;
02077 uint32_t pktToAirLo;
02078 uint32_t pktFromAirHi;
02079 uint32_t pktFromAirLo;
02080 } Sa_AcSysStats_t;
02081
02089 typedef struct {
02090 uint32_t errNoMem;
02091 uint32_t errCtx;
02092 uint32_t errEngine;
02093 uint32_t errProto;
02094 } Sa_ErrorSysStats_t;
02095
02103 typedef struct Sa_SysStats_s {
02104 Sa_ErrorSysStats_t err;
02105 Sa_IpsecSysStats_t esp;
02106 Sa_IpsecSysStats_t ah;
02107 Sa_SrtpSysStats_t srtp;
02108 Sa_AcSysStats_t ac;
02109 } Sa_SysStats_t;
02110
02122 typedef enum {
02123 sa_PKA_OP_ADD = 0,
02124 sa_PKA_OP_SUB,
02125 sa_PKA_OP_MUL,
02126 sa_PKA_OP_DIV,
02127 sa_PKA_OP_RSHIFT,
02128 sa_PKA_OP_LSHIFT,
02129 sa_PKA_OP_COMP,
02130 sa_PKA_OP_COPY,
02131 sa_PKA_OP_EXP2,
02132 sa_PKA_OP_EXP4
02133 } Sa_PkaOpTypes_t;
02147 typedef enum {
02148 sa_PKA_COMP_AEQB = 1,
02149 sa_PKA_COMP_AINFB = 2,
02150 sa_PKA_COMP_ASUPB = 4
02151 } Sa_PkaCompResults_t;
02155
02156
02157
02158
02159 #define sa_MAX_PKA_OPERAND_SIZE 128
02160 #define sa_MAX_PKA_OPERAND_SIZE_EXP4 64
02193 typedef struct {
02194 Sa_PkaOpTypes_t operation;
02195 Sa_PkaCompResults_t cmpResult;
02196 uint16_t numShiftBits;
02197 uint16_t oprandSize[2];
02198 uint16_t resultSize;
02199 uint16_t remSize;
02200 uint32_t* oprandPtr[3];
02201 uint32_t* remPtr;
02202 uint32_t* resultPtr;
02203 } Sa_PkaReqInfo_t;
02204
02220 #define sa_RNG_CTRL_REINIT 0x0001
02221
02226 #define sa_RNG_CTRL_ENABLE_INT 0x0002
02227
02231 #define sa_RNG_CTRL_RESET 0x0004
02232
02244 typedef struct {
02245 uint16_t ctrlBitfield;
02247 uint16_t clockDiv;
02248 uint32_t startupCycles;
02250 uint32_t minRefillCycles;
02252 uint32_t maxRefillCycles;
02254 } Sa_RngConfigParams_t;
02255
02263 typedef struct {
02264 uint32_t hi;
02265 uint32_t lo;
02266 } Sa_RngData_t;
02267
02273 #define sa_N_BUFS 1
02274
02284
02289 #define sa_SYS_BUF_INST 0
02290
02291
02298
02314 int16_t Sa_getBufferReq (Sa_SizeCfg_t *sizeCfg, int sizes[], int aligns[]);
02315
02334 int16_t Sa_create (Sa_Config_t *cfg, void* bases[], Sa_Handle *pHandle);
02335
02351 int16_t Sa_start (Sa_Handle handle, Sa_Config_t *cfg);
02352
02365 int16_t Sa_getShadowHandle (Sa_Handle handle, Sa_Handle *shandle);
02366
02367
02379 int16_t Sa_close (Sa_Handle handle, void* bases[]);
02380
02389 int16_t Sa_getSysStats (Sa_Handle handle, Sa_SysStats_t *stats);
02390
02404 Sa_State_t Sa_resetControl (Sa_Handle handle, Sa_State_t newState);
02405
02419 int16_t Sa_downloadImage (Sa_Handle handle, int modId, void* image, int sizeBytes);
02420
02434 int16_t Sa_rngInit (Sa_Handle handle, Sa_RngConfigParams_t* cfg);
02435
02452 int16_t Sa_getRandomNum (Sa_Handle handle, uint16_t f_isr, Sa_RngData_t* rnd);
02453
02463 int16_t Sa_rngClose (Sa_Handle handle);
02464
02477 int16_t Sa_pkaInit (Sa_Handle handle);
02478
02496 int16_t Sa_pkaOperation (Sa_Handle handle, Sa_PkaReqInfo_t* pkaReqInfo);
02497
02507 int16_t Sa_pkaClose (Sa_Handle handle);
02508
02519 uint32_t Sa_getID (Sa_Handle handle);
02520
02530 uint32_t Sa_getVersion (void);
02531
02532
02541 const char* Sa_getVersionStr (void);
02542
02557 int16_t Sa_getPDSPVersion (Sa_Handle handle, int modId, uint32_t *pVersion);
02558
02560
02566 #define sa_CHAN_N_BUFS 1
02567
02577
02582 #define sa_CHAN_BUF_INST 0
02583
02584
02592
02606 int16_t Sa_chanGetBufferReq (Sa_ChanSizeCfg_t *sizeCfg, int sizes[], int aligns[]);
02607
02624 int16_t Sa_chanCreate (Sa_Handle handle, Sa_ChanConfig_t *cfg, void* bases[],
02625 Sa_ChanHandle *pChanHdl);
02626
02636 int16_t Sa_chanClose (Sa_ChanHandle handle, void* bases[]);
02637
02652 int16_t Sa_chanControl (Sa_ChanHandle handle, Sa_ChanCtrlInfo_t *chanCtrlInfo);
02653
02674 int16_t Sa_chanStart (Sa_ChanHandle handle);
02675
02688 int16_t Sa_chanGetShadowHandle (Sa_ChanHandle handle, Sa_ChanHandle *shandle);
02689
02702 int16_t Sa_chanReceiveData (Sa_ChanHandle handle, Sa_PktInfo_t *pktInfo);
02703
02704
02719 int16_t Sa_chanSendData (Sa_ChanHandle handle, Sa_PktInfo_t *pktInfo, uint16_t clear);
02720
02721
02731 int16_t Sa_chanGetStats (Sa_ChanHandle handle, uint16_t flags, Sa_Stats_t *stats);
02732
02743 uint32_t Sa_chanGetID (Sa_ChanHandle handle);
02744
02766 int16_t Sa_chanGetSwInfo (Sa_ChanHandle handle, uint16_t dir, Sa_SWInfo_t* pChanSwInfo);
02767
02768
02770
02775
02785 uint16_t Sa_isScBufFree (uint8_t* scBuf);
02786
02788
02793
02804 #define sa_MK_UINT32(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
02805
02819 static inline
02820 void sa_mDmResetCmdLb(Sa_CmdLbUpdateInfo_t* updateInfo,
02821 uint32_t* cmdLb)
02822 {
02823 if (updateInfo->validBitfield & sa_CMDL_UPDATE_VALID_ENC)
02824 {
02825
02826 cmdLb[updateInfo->encSizeInfo.index] &= 0xffff0000UL;
02827 cmdLb[updateInfo->encOffsetInfo.index] &= 0x00ffffffUL;
02828 }
02829
02830 if (updateInfo->validBitfield & sa_CMDL_UPDATE_VALID_AUTH)
02831 {
02832
02833 cmdLb[updateInfo->authSizeInfo.index] &= 0xffff0000UL;
02834 cmdLb[updateInfo->authOffsetInfo.index] &= 0x00ffffffUL;
02835 }
02836
02837 if (updateInfo->subMode == sa_DM_CCM)
02838 {
02839
02840 cmdLb[2] &= 0xffff0000UL;
02841
02842 }
02843 }
02844
02872 static inline
02873 void sa_mDmUpdateCmdLb(uint8_t encOffset,
02874 uint16_t encSize,
02875 uint8_t* pEncIV,
02876 uint8_t authOffset,
02877 uint16_t authSize,
02878 uint8_t* pAuthIV,
02879 uint8_t aadSize,
02880 uint8_t* aad,
02881 uint8_t* pDataBuf,
02882 Sa_CmdLbUpdateInfo_t* updateInfo,
02883 uint32_t* cmdLb)
02884 {
02885
02886 switch (updateInfo->subMode)
02887 {
02888 case sa_DM_GEN:
02889 if (updateInfo->validBitfield & sa_CMDL_UPDATE_VALID_ENC)
02890 {
02891 cmdLb[updateInfo->encSizeInfo.index] |= encSize;
02892 cmdLb[updateInfo->encOffsetInfo.index] |= ((uint32_t)encOffset << 24);
02893
02894 if (updateInfo->validBitfield & sa_CMDL_UPDATE_VALID_ENC_IV)
02895 {
02896 uint32_t *data = &cmdLb[updateInfo->encIvInfo.index];
02897 uint8_t *iv = pEncIV;
02898
02899 data[0] = sa_MK_UINT32(iv[0], iv[1], iv[2], iv[3]);
02900 data[1] = sa_MK_UINT32(iv[4], iv[5], iv[6], iv[7]);
02901
02902 if (updateInfo->encIvInfo.size > 8)
02903 {
02904 data[2] = sa_MK_UINT32(iv[8], iv[9], iv[10], iv[11]);
02905 data[3] = sa_MK_UINT32(iv[12], iv[13], iv[14], iv[15]);
02906 }
02907 }
02908 }
02909
02910 if (updateInfo->validBitfield & sa_CMDL_UPDATE_VALID_AUTH)
02911 {
02912 cmdLb[updateInfo->authSizeInfo.index] |= authSize;
02913 cmdLb[updateInfo->authOffsetInfo.index] |= (authOffset << 24);
02914
02915 if (updateInfo->validBitfield & sa_CMDL_UPDATE_VALID_AUTH_IV)
02916 {
02917 uint32_t *data = &cmdLb[updateInfo->authIvInfo.index];
02918 uint8_t *iv = pAuthIV;
02919
02920 data[0] = sa_MK_UINT32(iv[0], iv[1], iv[2], iv[3]);
02921 data[1] = sa_MK_UINT32(iv[4], iv[5], iv[6], iv[7]);
02922
02923 if (updateInfo->authIvInfo.size > 8)
02924 {
02925 data[2] = sa_MK_UINT32(iv[8], iv[9], iv[10], iv[11]);
02926 data[3] = sa_MK_UINT32(iv[12], iv[13], iv[14], iv[15]);
02927 }
02928 }
02929
02930 if (updateInfo->validBitfield & sa_CMDL_UPDATE_VALID_AUX_KEY)
02931 {
02932
02933 int offset = (authSize & 0xF)?4:0;
02934 memcpy(&cmdLb[updateInfo->auxKeyInfo.index], &updateInfo->auxKey[offset], 16);
02935 }
02936 }
02937 break;
02938
02939
02940 case sa_DM_CCM:
02941 {
02942 uint8_t *iv = pEncIV;
02943
02944 cmdLb[0] |= encSize;
02945 cmdLb[1] |= ((uint32_t)encOffset << 24);
02946
02947
02948 cmdLb[2] |= ((aad[0] << 8) + aad[1]);
02949 cmdLb[3] = sa_MK_UINT32(aad[2], aad[3], aad[4], aad[5]);
02950 if (aadSize == 8)
02951 {
02952 cmdLb[4] = (aad[6] << 24) + (aad[7] << 16);
02953 }
02954 else
02955 {
02956 cmdLb[4] = sa_MK_UINT32(aad[6], aad[7], aad[8], aad[9]);
02957 cmdLb[5] = (aad[10] << 24) + (aad[11] << 16);
02958 }
02959
02960
02961 cmdLb[11] = cmdLb[7] = sa_MK_UINT32(iv[0], iv[1], iv[2], iv[3]);
02962 cmdLb[12] = cmdLb[8] = sa_MK_UINT32(iv[4], iv[5], iv[6], iv[7]);
02963
02964
02965 cmdLb[9] = encSize;
02966
02967 }
02968 break;
02969
02970 case sa_DM_GCM:
02971 {
02972
02973 uint8_t *iv = pEncIV;
02974
02975 cmdLb[0] |= encSize;
02976 cmdLb[1] |= ((uint32_t)encOffset << 24);
02977
02978
02979 cmdLb[4] = sa_MK_UINT32(aad[0], aad[1], aad[2], aad[3]);
02980 cmdLb[5] = sa_MK_UINT32(aad[4], aad[5], aad[6], aad[7]);
02981 if (aadSize == 12)
02982 {
02983 cmdLb[6] = sa_MK_UINT32(aad[8], aad[9], aad[10], aad[11]);
02984 }
02985
02986
02987 cmdLb[9] = sa_MK_UINT32(iv[0], iv[1], iv[2], iv[3]);
02988 cmdLb[10] = sa_MK_UINT32(iv[4], iv[5], iv[6], iv[7]);
02989
02990
02991 cmdLb[3] = encSize << 3;
02992
02993 }
02994 break;
02995
02996 case sa_DM_GMAC:
02997 {
02998 uint8_t *iv = pAuthIV;
02999 uint8_t *payload = pDataBuf + authOffset;
03000 uint8_t dataAppended = 16 - aadSize;
03001
03002 cmdLb[0] |= authSize - dataAppended;
03003 cmdLb[1] |= ((authOffset + dataAppended) << 24);
03004
03005
03006 cmdLb[4] = sa_MK_UINT32(aad[0], aad[1], aad[2], aad[3]);
03007 cmdLb[5] = sa_MK_UINT32(aad[4], aad[5], aad[6], aad[7]);
03008 if (aadSize == 8)
03009 {
03010 cmdLb[6] = sa_MK_UINT32(payload[0], payload[1], payload[2], payload[3]);
03011 cmdLb[7] = sa_MK_UINT32(payload[4], payload[5], payload[6], payload[7]);
03012 }
03013 else
03014 {
03015 cmdLb[6] = sa_MK_UINT32(aad[8], aad[9], aad[10], aad[11]);
03016 cmdLb[7] = sa_MK_UINT32(payload[0], payload[1], payload[2], payload[3]);
03017 }
03018
03019
03020 cmdLb[9] = sa_MK_UINT32(iv[0], iv[1], iv[2], iv[3]);
03021 cmdLb[10] = sa_MK_UINT32(iv[4], iv[5], iv[6], iv[7]);
03022
03023
03024 cmdLb[3] = (authSize + aadSize) << 3;
03025
03026 }
03027 break;
03028
03029 case sa_DM_GMAC_AH:
03030 {
03031 uint8_t *iv = pAuthIV;
03032
03033 cmdLb[0] |= authSize;
03034 cmdLb[1] |= (authOffset << 24);
03035
03036
03037 cmdLb[3] = (authSize) << 3;
03038
03039
03040 cmdLb[5] = sa_MK_UINT32(iv[0], iv[1], iv[2], iv[3]);
03041 cmdLb[6] = sa_MK_UINT32(iv[4], iv[5], iv[6], iv[7]);
03042
03043 }
03044 break;
03045
03046
03047 default:
03048
03049 break;
03050 }
03051 }
03052
03068 typedef struct {
03069 uint32_t word[6];
03070 } Sa_psInfo_t;
03071
03080 #define sa_PSINFO_FORMAT_CMD(x, offset, len) ((x)->word[0] = (0x20000000UL | ((offset) << 16) | (len)))
03081 #define sa_PSINFO_SET_COUNTC(x, countC) ((x)->word[1] = (countC))
03082 static inline void sa_PSINFO_SET_IV(Sa_psInfo_t *x, uint32_t *iv, int ivSize)
03083 {
03084 int i;
03085 x->word[0] |= ((ivSize + 8) << 24);
03086 for( i = 0; i < ivSize/4 ; i++)
03087 x->word[i+ 2] = iv[i];
03088 }
03104 #define sa_RESET_SUBSYSTEM() \
03105 { \
03106 SYSTEM_WRITE32(&(pSaRegs->PDSP_CONTROL_STATUS[0].PDSP_CONTROL), 0); \
03107 SYSTEM_WRITE32(&(pSaRegs->PDSP_CONTROL_STATUS[1].PDSP_CONTROL), 0); \
03108 }
03109
03119 #define sa_ENABLE_SUBSYSTEM() \
03120 { \
03121 uint32_t value; \
03122 value = SYSTEM_READ32(&(pSaRegs->PDSP_CONTROL_STATUS[0].PDSP_CONTROL)) | CSL_CP_ACE_PDSP_CONTROL_ENABLE_MASK; \
03123 SYSTEM_WRITE32(&(pSaRegs->PDSP_CONTROL_STATUS[0].PDSP_CONTROL), (value)); \
03124 value = SYSTEM_READ32(&(pSaRegs->PDSP_CONTROL_STATUS[1].PDSP_CONTROL)) | CSL_CP_ACE_PDSP_CONTROL_ENABLE_MASK; \
03125 SYSTEM_WRITE32(&(pSaRegs->PDSP_CONTROL_STATUS[1].PDSP_CONTROL), (value)); \
03126 }
03127
03138 #define sa_DOWNLOAD_MODULE(id,img,size) \
03139 SYSTEM_COPY(pSaRegs->PDSP_IRAM[id].DATA, img, size)
03140
03151 #define sa_GET_SYSTEM_STATE(x) \
03152 { int enable=0; int disable=0; \
03153 if ( (SYSTEM_READ32(&(pSaRegs->PDSP_CONTROL_STATUS[0].PDSP_CONTROL)) & CSL_CP_ACE_PDSP_CONTROL_ENABLE_MASK) == \
03154 (CSL_CP_ACE_PDSP_CONTROL_ENABLE_MASK) ) \
03155 enable++; else disable++; \
03156 if ( (SYSTEM_READ32(&(pSaRegs->PDSP_CONTROL_STATUS[1].PDSP_CONTROL)) & CSL_CP_ACE_PDSP_CONTROL_ENABLE_MASK) == \
03157 (CSL_CP_ACE_PDSP_CONTROL_ENABLE_MASK) ) \
03158 enable++; else disable++; \
03159 if ( (enable > 0) && (disable > 0) ) (x) = sa_STATE_INCONSISTENT; \
03160 else if (enable > 0) (x) = sa_STATE_ENABLE; \
03161 else (x) = sa_STATE_RESET; \
03162 } (x) = (x)
03163
03164
03165
03166
03168
03169
03383 #ifdef __cplusplus
03384 }
03385 #endif
03386
03387 #endif
03388
03389