hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/** @file crypt_new_rom.c
 *
 *  @brief This file contains the api for AES based functions
 *
 * Copyright (C) 2014-2017, Marvell International Ltd.
 *
 * This software file (the "File") is distributed by Marvell International
 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
 * (the "License").  You may use, redistribute and/or modify this File in
 * accordance with the terms and conditions of the License, a copy of which
 * is available by writing to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
 *
 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
 * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
 * this warranty disclaimer.
 */
 
/******************************************************
Change log:
    03/07/2014: Initial version
******************************************************/
#ifndef _CRYPT_NEW_ROM_H_
#define _CRYPT_NEW_ROM_H_
 
#define MRVL_AES_CMD_REQUEST_TYPE_INVALID (1)
#define MRVL_AES_ALGORITHM_INVALID        (1<<1)
#define MRVL_AES_KEY_SIZE_INVALID         (1<<2)
#define MRVL_AES_KEY_IV_SIZE_INVALID      (1<<3)
#define MRVL_AES_ENCRYPT_DATA_OVER_127    (1<<4)
#define MRVL_AES_ENCRYPT_DATA_LESS_2      (1<<5)
#define MRVL_AES_NOT_EN_AND_DECRYPT       (1<<6)
#define MRVL_AES_KEY_IV_INVALID_AES       (1<<7)
#define MRVL_AES_KEY_IV_INVALID_AES_WRAP  (1<<8)
#define MRVL_AES_KEY_IV_INVALID_RC4       (1<<9)
#define MRVL_AES_DATA_SIZE_INVALID        (1<<10)
 
#define MRVL_AES_NONCE_INVALID            (1<<11)
#define MRVL_AES_AAD_INVALID              (1<<12)
 
#define host_AES_ENCRYPT  0x1
#define host_AES_DECRYPT  0x0
 
#define MRVL_CRYPTO_TEST_RC4        1
#define MRVL_CRYPTO_TEST_AES_ECB    2
#define MRVL_CRYPTO_TEST_AES_WRAP   3
#define MRVL_CRYPTO_TEST_AEC_CCM    4
#define MRVL_CRYPTO_TEST_WAPI       5
 
/* basic data structs to support AES feature */
/* enum for encrypt/decrypt */
typedef enum {
   CRYPT_DECRYPT = 0,
   CRYPT_ENCRYPT = 1,
   CRYPT_UNKNOWN
} MRVL_ENDECRYPT_e;
 
/* data strcut to hold action type and data to be processed */
typedef struct {
   UINT8 enDeAction;    /* encrypt or decrypt */
   UINT8 *pData;
} MRVL_ENDECRYPT_t;
 
#ifdef WAPI_HW_SUPPORT
extern void MRVL_WapiEncrypt(MRVL_ENDECRYPT_t *crypt, int *pErr);
extern void MRVL_WapiDecrypt(MRVL_ENDECRYPT_t *crypt, int *pErr);
#endif
 
extern BOOLEAN (*MRVL_AesPrimitiveEncrypt_hook) (MRVL_ENDECRYPT_t *crypt,
                        int *pErr);
extern void MRVL_AesPrimitiveEncrypt(MRVL_ENDECRYPT_t *crypt, int *pErr);
 
extern BOOLEAN (*MRVL_AesPrimitiveDecrypt_hook) (MRVL_ENDECRYPT_t *crypt,
                        int *pErr);
extern void MRVL_AesPrimitiveDecrypt(MRVL_ENDECRYPT_t *crypt, int *pErr);
 
extern BOOLEAN (*MRVL_AesWrapEncrypt_hook) (MRVL_ENDECRYPT_t *crypt, int *pErr);
extern void MRVL_AesWrapEncrypt(MRVL_ENDECRYPT_t *crypt, int *pErr);
 
extern BOOLEAN (*MRVL_AesWrapDecrypt_hook) (MRVL_ENDECRYPT_t *crypt, int *pErr);
extern void MRVL_AesWrapDecrypt(MRVL_ENDECRYPT_t *crypt, int *pErr);
 
#ifdef DIAG_AES_CCM
extern BOOLEAN (*MRVL_AesCCMPollingMode_hook) (MRVL_ENDECRYPT_t *crypt,
                          int *pErr, int decEnable);
extern void MRVL_AesCCMPollingMode(MRVL_ENDECRYPT_t *crypt, int *pErr,
                  int decEnable);
#endif
 
extern BOOLEAN (*MRVL_AesEncrypt_hook) (UINT8 *kek, UINT8 kekLen, UINT8 *data,
                   UINT8 *ret, int *ptr_val);
extern int MRVL_AesEncrypt(UINT8 *kek, UINT8 kekLen, UINT8 *data, UINT8 *ret);
 
extern BOOLEAN (*MRVL_AesValidateHostRequest_hook) (UINT32 *pBitMap,
                           UINT8 *pCmdPtr,
                           UINT8 *pCryptData,
                           SINT8 *pAESWrapEnc,
                           int *ptr_val);
extern int MRVL_AesValidateHostRequest(UINT32 *pBitMap, UINT8 *pCmdPtr,
                      UINT8 *pCryptData, SINT8 *pAESWrapEnc);
 
#ifdef RC4
extern BOOLEAN (*MRVL_Rc4Cryption_hook) (MRVL_ENDECRYPT_t *crypt, int *pErr);
extern void MRVL_Rc4Cryption(void *priv, MRVL_ENDECRYPT_t *crypt, int *pErr);
#endif
 
extern BOOLEAN (*MRVL_AesWrap_hook) (UINT8 *kek, UINT8 kekLen, UINT32 n,
                    UINT8 *plain, UINT8 *keyIv, UINT8 *cipher,
                    int *ptr_val);
extern int MRVL_AesWrap(UINT8 *kek, UINT8 kekLen, UINT32 n, UINT8 *plain,
           UINT8 *keyIv, UINT8 *cipher);
 
extern BOOLEAN (*MRVL_AesUnWrap_hook) (UINT8 *kek, UINT8 kekLen, UINT32 n,
                      UINT8 *cipher, UINT8 *keyIv,
                      UINT8 *plain, int *ptr_val);
extern int MRVL_AesUnWrap(UINT8 *kek, UINT8 kekLen, UINT32 n, UINT8 *cipher,
             UINT8 *keyIv, UINT8 *plain);
 
extern BOOLEAN (*MRVL_AesSetKey_hook) (const UINT8 *kek, UINT8 kekLen,
                      int *ptr_val);
extern int MRVL_AesSetKey(const UINT8 *kek, UINT8 kekLen);
 
/* AES related defines */
#define MRVL_AES_KEY_UPDATE_DONE    5
#define MRVL_AES_DONE           6
#define MRVL_AES_ENGINE_BITS_POS    12
 
#define MRVL_AES_KEYUPDATE_LOC      0x00000900
#define MRVL_AES_ENABLE_ENCR_LOC    0x00000500
#define MRVL_AES_ENABLE_DECR_LOC    0x00000700
 
/* convert 4 individual bytes into a 4 byte unsigned int */
#define MRVL_AES_GET_UINT32(x) ((x[3]<<24)|(x[2]<<16)|(x[1]<<8)|x[0])
 
/* convert 4 byte unsigned int back to a 4 individual bytes */
#define MRVL_AES_CONVERT_UINT32_UINT8(x,u)              \
    *u  = (UINT8)((((UINT32)x)&0x000000ff));            \
    *(u + 1)= (UINT8)((((UINT32)x)&0x0000ff00)>>8);     \
    *(u + 2)= (UINT8)((((UINT32)x)&0x00ff0000)>>16);    \
    *(u + 3)= (UINT8)((((UINT32)x)&0xff000000)>>24)     \
 
 
/* HW register read macros */
#define MRVL_AES_READ32(x) (WL_REGS32(x))
#define MRVL_AES_READ16(x) (WL_REGS16(x))
#define MRVL_AES_READ8(x)  (WL_REGS8(x) )
 
/* HW register write macros */
#define MRVL_AES_WRITE32(reg,val) (WL_WRITE_REGS32(reg,val))
#define MRVL_AES_WRITE16(reg,val) (WL_WRITE_REGS16(reg,val))
#define MRVL_AES_WRITE8(reg,val)  (WL_WRITE_REGS8(reg,val))
 
extern UINT32 (*ramHook_CryptNew_EnterCritical) (void);
extern void (*ramHook_CryptNew_ExitCritical) (UINT32 intSave);
 
extern int MRVL_AES_MEMCMP(UINT8 *dst, UINT8 *src, int len);
extern void MRVL_AES_MEMSET(UINT8 *dst, UINT8 val, int size);
extern void MRVL_AES_MEMCPY(UINT8 *dst, UINT8 *src, int size);
extern int MRVL_AesInterCheck(UINT8 *inter, UINT8 *d);
#ifdef DIAG_AES_CCM
extern void MRVL_AesCCMEncrypt(MRVL_ENDECRYPT_t *crypt, int *pErr);
extern void MRVL_AesCCMDecrypt(MRVL_ENDECRYPT_t *crypt, int *pErr);
#endif
 
#endif /* _CRYPT_NEW_ROM_H_ */