]>
git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/dpdk/drivers/crypto/dpaa2_sec/hw/rta/key_cmd.h
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
3 * Copyright 2008-2016 Freescale Semiconductor Inc.
8 #ifndef __RTA_KEY_CMD_H__
9 #define __RTA_KEY_CMD_H__
11 extern enum rta_sec_era rta_sec_era
;
13 /* Allowed encryption flags for each SEC Era */
14 static const uint32_t key_enc_flags
[] = {
21 ENC
| NWB
| EKT
| TK
| PTS
,
22 ENC
| NWB
| EKT
| TK
| PTS
26 rta_key(struct program
*program
, uint32_t key_dst
,
27 uint32_t encrypt_flags
, uint64_t src
, uint32_t length
,
31 bool is_seq_cmd
= false;
32 unsigned int start_pc
= program
->current_pc
;
34 if (encrypt_flags
& ~key_enc_flags
[rta_sec_era
]) {
35 pr_err("KEY: Flag(s) not supported by SEC Era %d\n",
36 USER_SEC_ERA(rta_sec_era
));
48 /* check parameters */
50 if ((flags
& IMMED
) || (flags
& SGF
)) {
51 pr_err("SEQKEY: Invalid flag. SEC PC: %d; Instr: %d\n",
53 program
->current_instruction
);
56 if ((rta_sec_era
<= RTA_SEC_ERA_5
) &&
57 ((flags
& VLF
) || (flags
& AIDF
))) {
58 pr_err("SEQKEY: Flag(s) not supported by SEC Era %d\n",
59 USER_SEC_ERA(rta_sec_era
));
63 if ((flags
& AIDF
) || (flags
& VLF
)) {
64 pr_err("KEY: Invalid flag. SEC PC: %d; Instr: %d\n",
66 program
->current_instruction
);
69 if ((flags
& SGF
) && (flags
& IMMED
)) {
70 pr_err("KEY: Invalid flag. SEC PC: %d; Instr: %d\n",
72 program
->current_instruction
);
77 if ((encrypt_flags
& PTS
) &&
78 ((encrypt_flags
& ENC
) || (encrypt_flags
& NWB
) ||
80 pr_err("KEY: Invalid flag / destination. SEC PC: %d; Instr: %d\n",
81 program
->current_pc
, program
->current_instruction
);
85 if (key_dst
== AFHA_SBOX
) {
86 if (rta_sec_era
== RTA_SEC_ERA_7
) {
87 pr_err("KEY: AFHA S-box not supported by SEC Era %d\n",
88 USER_SEC_ERA(rta_sec_era
));
93 pr_err("KEY: Invalid flag. SEC PC: %d; Instr: %d\n",
95 program
->current_instruction
);
100 * Sbox data loaded into the ARC-4 processor must be exactly
101 * 258 bytes long, or else a data sequence error is generated.
104 pr_err("KEY: Invalid length. SEC PC: %d; Instr: %d\n",
106 program
->current_instruction
);
111 /* write key destination and class fields */
114 opcode
|= KEY_DEST_CLASS1
;
117 opcode
|= KEY_DEST_CLASS2
;
120 opcode
|= KEY_DEST_CLASS1
| KEY_DEST_PKHA_E
;
123 opcode
|= KEY_DEST_CLASS1
| KEY_DEST_AFHA_SBOX
;
125 case (MDHA_SPLIT_KEY
):
126 opcode
|= KEY_DEST_CLASS2
| KEY_DEST_MDHA_SPLIT
;
129 pr_err("KEY: Invalid destination. SEC PC: %d; Instr: %d\n",
130 program
->current_pc
, program
->current_instruction
);
134 /* write key length */
135 length
&= KEY_LENGTH_MASK
;
138 /* write key command specific flags */
139 if (encrypt_flags
& ENC
) {
140 /* Encrypted (black) keys must be padded to 8 bytes (CCM) or
141 * 16 bytes (ECB) depending on EKT bit. AES-CCM encrypted keys
142 * (EKT = 1) have 6-byte nonce and 6-byte MAC after padding.
145 if (encrypt_flags
& EKT
) {
147 length
= ALIGN(length
, 8);
150 length
= ALIGN(length
, 16);
152 if (encrypt_flags
& TK
)
155 if (encrypt_flags
& NWB
)
157 if (encrypt_flags
& PTS
)
160 /* write general command flags */
173 __rta_out32(program
, opcode
);
174 program
->current_instruction
++;
177 __rta_inline_data(program
, src
, flags
& __COPY_MASK
, length
);
179 __rta_out64(program
, program
->ps
, src
);
181 return (int)start_pc
;
184 program
->first_error_pc
= start_pc
;
185 program
->current_instruction
++;
189 #endif /* __RTA_KEY_CMD_H__ */