1049359d6SJames Hsiao /** 2049359d6SJames Hsiao * AMCC SoC PPC4xx Crypto Driver 3049359d6SJames Hsiao * 4049359d6SJames Hsiao * Copyright (c) 2008 Applied Micro Circuits Corporation. 5049359d6SJames Hsiao * All rights reserved. James Hsiao <jhsiao@amcc.com> 6049359d6SJames Hsiao * 7049359d6SJames Hsiao * This program is free software; you can redistribute it and/or modify 8049359d6SJames Hsiao * it under the terms of the GNU General Public License as published by 9049359d6SJames Hsiao * the Free Software Foundation; either version 2 of the License, or 10049359d6SJames Hsiao * (at your option) any later version. 11049359d6SJames Hsiao * 12049359d6SJames Hsiao * This program is distributed in the hope that it will be useful, 13049359d6SJames Hsiao * but WITHOUT ANY WARRANTY; without even the implied warranty of 14049359d6SJames Hsiao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15049359d6SJames Hsiao * GNU General Public License for more details. 16049359d6SJames Hsiao * 17049359d6SJames Hsiao * This file defines the security context 1825985edcSLucas De Marchi * associate format. 19049359d6SJames Hsiao */ 20049359d6SJames Hsiao 21049359d6SJames Hsiao #ifndef __CRYPTO4XX_SA_H__ 22049359d6SJames Hsiao #define __CRYPTO4XX_SA_H__ 23049359d6SJames Hsiao 24049359d6SJames Hsiao #define AES_IV_SIZE 16 25049359d6SJames Hsiao 26049359d6SJames Hsiao /** 27049359d6SJames Hsiao * Contents of Dynamic Security Association (SA) with all possible fields 28049359d6SJames Hsiao */ 29049359d6SJames Hsiao union dynamic_sa_contents { 30049359d6SJames Hsiao struct { 31049359d6SJames Hsiao u32 arc4_state_ptr:1; 32049359d6SJames Hsiao u32 arc4_ij_ptr:1; 33049359d6SJames Hsiao u32 state_ptr:1; 34049359d6SJames Hsiao u32 iv3:1; 35049359d6SJames Hsiao u32 iv2:1; 36049359d6SJames Hsiao u32 iv1:1; 37049359d6SJames Hsiao u32 iv0:1; 38049359d6SJames Hsiao u32 seq_num_mask3:1; 39049359d6SJames Hsiao u32 seq_num_mask2:1; 40049359d6SJames Hsiao u32 seq_num_mask1:1; 41049359d6SJames Hsiao u32 seq_num_mask0:1; 42049359d6SJames Hsiao u32 seq_num1:1; 43049359d6SJames Hsiao u32 seq_num0:1; 44049359d6SJames Hsiao u32 spi:1; 45049359d6SJames Hsiao u32 outer_size:5; 46049359d6SJames Hsiao u32 inner_size:5; 47049359d6SJames Hsiao u32 key_size:4; 48049359d6SJames Hsiao u32 cmd_size:4; 49049359d6SJames Hsiao } bf; 50049359d6SJames Hsiao u32 w; 51049359d6SJames Hsiao } __attribute__((packed)); 52049359d6SJames Hsiao 53049359d6SJames Hsiao #define DIR_OUTBOUND 0 54049359d6SJames Hsiao #define DIR_INBOUND 1 55049359d6SJames Hsiao #define SA_OP_GROUP_BASIC 0 56049359d6SJames Hsiao #define SA_OPCODE_ENCRYPT 0 57049359d6SJames Hsiao #define SA_OPCODE_DECRYPT 0 58049359d6SJames Hsiao #define SA_OPCODE_HASH 3 59049359d6SJames Hsiao #define SA_CIPHER_ALG_DES 0 60049359d6SJames Hsiao #define SA_CIPHER_ALG_3DES 1 61049359d6SJames Hsiao #define SA_CIPHER_ALG_ARC4 2 62049359d6SJames Hsiao #define SA_CIPHER_ALG_AES 3 63049359d6SJames Hsiao #define SA_CIPHER_ALG_KASUMI 4 64049359d6SJames Hsiao #define SA_CIPHER_ALG_NULL 15 65049359d6SJames Hsiao 66049359d6SJames Hsiao #define SA_HASH_ALG_MD5 0 67049359d6SJames Hsiao #define SA_HASH_ALG_SHA1 1 68049359d6SJames Hsiao #define SA_HASH_ALG_NULL 15 69049359d6SJames Hsiao #define SA_HASH_ALG_SHA1_DIGEST_SIZE 20 70049359d6SJames Hsiao 71049359d6SJames Hsiao #define SA_LOAD_HASH_FROM_SA 0 72049359d6SJames Hsiao #define SA_LOAD_HASH_FROM_STATE 2 73049359d6SJames Hsiao #define SA_NOT_LOAD_HASH 3 74049359d6SJames Hsiao #define SA_LOAD_IV_FROM_SA 0 75049359d6SJames Hsiao #define SA_LOAD_IV_FROM_INPUT 1 76049359d6SJames Hsiao #define SA_LOAD_IV_FROM_STATE 2 77049359d6SJames Hsiao #define SA_LOAD_IV_GEN_IV 3 78049359d6SJames Hsiao 79049359d6SJames Hsiao #define SA_PAD_TYPE_CONSTANT 2 80049359d6SJames Hsiao #define SA_PAD_TYPE_ZERO 3 81049359d6SJames Hsiao #define SA_PAD_TYPE_TLS 5 82049359d6SJames Hsiao #define SA_PAD_TYPE_DTLS 5 83049359d6SJames Hsiao #define SA_NOT_SAVE_HASH 0 84049359d6SJames Hsiao #define SA_SAVE_HASH 1 85049359d6SJames Hsiao #define SA_NOT_SAVE_IV 0 86049359d6SJames Hsiao #define SA_SAVE_IV 1 87049359d6SJames Hsiao #define SA_HEADER_PROC 1 88049359d6SJames Hsiao #define SA_NO_HEADER_PROC 0 89049359d6SJames Hsiao 90049359d6SJames Hsiao union sa_command_0 { 91049359d6SJames Hsiao struct { 92049359d6SJames Hsiao u32 scatter:1; 93049359d6SJames Hsiao u32 gather:1; 94049359d6SJames Hsiao u32 save_hash_state:1; 95049359d6SJames Hsiao u32 save_iv:1; 96049359d6SJames Hsiao u32 load_hash_state:2; 97049359d6SJames Hsiao u32 load_iv:2; 98049359d6SJames Hsiao u32 digest_len:4; 99049359d6SJames Hsiao u32 hdr_proc:1; 100049359d6SJames Hsiao u32 extend_pad:1; 101049359d6SJames Hsiao u32 stream_cipher_pad:1; 102049359d6SJames Hsiao u32 rsv:1; 103049359d6SJames Hsiao u32 hash_alg:4; 104049359d6SJames Hsiao u32 cipher_alg:4; 105049359d6SJames Hsiao u32 pad_type:2; 106049359d6SJames Hsiao u32 op_group:2; 107049359d6SJames Hsiao u32 dir:1; 108049359d6SJames Hsiao u32 opcode:3; 109049359d6SJames Hsiao } bf; 110049359d6SJames Hsiao u32 w; 111049359d6SJames Hsiao } __attribute__((packed)); 112049359d6SJames Hsiao 113049359d6SJames Hsiao #define CRYPTO_MODE_ECB 0 114049359d6SJames Hsiao #define CRYPTO_MODE_CBC 1 115049359d6SJames Hsiao 116049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_NO_FB 0 117049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_64BIT_OFB 0 118049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_8BIT_CFB 1 119049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_1BIT_CFB 2 120049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_128BIT_CFB 3 121049359d6SJames Hsiao 122049359d6SJames Hsiao #define SA_AES_KEY_LEN_128 2 123049359d6SJames Hsiao #define SA_AES_KEY_LEN_192 3 124049359d6SJames Hsiao #define SA_AES_KEY_LEN_256 4 125049359d6SJames Hsiao 126049359d6SJames Hsiao #define SA_REV2 1 127049359d6SJames Hsiao /** 128049359d6SJames Hsiao * The follow defines bits sa_command_1 129049359d6SJames Hsiao * In Basic hash mode this bit define simple hash or hmac. 130049359d6SJames Hsiao * In IPsec mode, this bit define muting control. 131049359d6SJames Hsiao */ 132049359d6SJames Hsiao #define SA_HASH_MODE_HASH 0 133049359d6SJames Hsiao #define SA_HASH_MODE_HMAC 1 134049359d6SJames Hsiao #define SA_MC_ENABLE 0 135049359d6SJames Hsiao #define SA_MC_DISABLE 1 136049359d6SJames Hsiao #define SA_NOT_COPY_HDR 0 137049359d6SJames Hsiao #define SA_COPY_HDR 1 138049359d6SJames Hsiao #define SA_NOT_COPY_PAD 0 139049359d6SJames Hsiao #define SA_COPY_PAD 1 140049359d6SJames Hsiao #define SA_NOT_COPY_PAYLOAD 0 141049359d6SJames Hsiao #define SA_COPY_PAYLOAD 1 142049359d6SJames Hsiao #define SA_EXTENDED_SN_OFF 0 143049359d6SJames Hsiao #define SA_EXTENDED_SN_ON 1 144049359d6SJames Hsiao #define SA_SEQ_MASK_OFF 0 145049359d6SJames Hsiao #define SA_SEQ_MASK_ON 1 146049359d6SJames Hsiao 147049359d6SJames Hsiao union sa_command_1 { 148049359d6SJames Hsiao struct { 149049359d6SJames Hsiao u32 crypto_mode31:1; 150049359d6SJames Hsiao u32 save_arc4_state:1; 151049359d6SJames Hsiao u32 arc4_stateful:1; 152049359d6SJames Hsiao u32 key_len:5; 153049359d6SJames Hsiao u32 hash_crypto_offset:8; 154049359d6SJames Hsiao u32 sa_rev:2; 155049359d6SJames Hsiao u32 byte_offset:1; 156049359d6SJames Hsiao u32 hmac_muting:1; 157049359d6SJames Hsiao u32 feedback_mode:2; 158049359d6SJames Hsiao u32 crypto_mode9_8:2; 159049359d6SJames Hsiao u32 extended_seq_num:1; 160049359d6SJames Hsiao u32 seq_num_mask:1; 161049359d6SJames Hsiao u32 mutable_bit_proc:1; 162049359d6SJames Hsiao u32 ip_version:1; 163049359d6SJames Hsiao u32 copy_pad:1; 164049359d6SJames Hsiao u32 copy_payload:1; 165049359d6SJames Hsiao u32 copy_hdr:1; 166049359d6SJames Hsiao u32 rsv1:1; 167049359d6SJames Hsiao } bf; 168049359d6SJames Hsiao u32 w; 169049359d6SJames Hsiao } __attribute__((packed)); 170049359d6SJames Hsiao 171049359d6SJames Hsiao struct dynamic_sa_ctl { 172453e3090SChristian Lamparter union dynamic_sa_contents sa_contents; 173049359d6SJames Hsiao union sa_command_0 sa_command_0; 174049359d6SJames Hsiao union sa_command_1 sa_command_1; 175049359d6SJames Hsiao } __attribute__((packed)); 176049359d6SJames Hsiao 177049359d6SJames Hsiao /** 178049359d6SJames Hsiao * State Record for Security Association (SA) 179049359d6SJames Hsiao */ 180049359d6SJames Hsiao struct sa_state_record { 181049359d6SJames Hsiao u32 save_iv[4]; 182049359d6SJames Hsiao u32 save_hash_byte_cnt[2]; 183049359d6SJames Hsiao u32 save_digest[16]; 184049359d6SJames Hsiao } __attribute__((packed)); 185049359d6SJames Hsiao 186049359d6SJames Hsiao /** 187049359d6SJames Hsiao * Security Association (SA) for AES128 188049359d6SJames Hsiao * 189049359d6SJames Hsiao */ 190049359d6SJames Hsiao struct dynamic_sa_aes128 { 191049359d6SJames Hsiao struct dynamic_sa_ctl ctrl; 192049359d6SJames Hsiao u32 key[4]; 193049359d6SJames Hsiao u32 iv[4]; /* for CBC, OFC, and CFB mode */ 194049359d6SJames Hsiao u32 state_ptr; 195049359d6SJames Hsiao u32 reserved; 196049359d6SJames Hsiao } __attribute__((packed)); 197049359d6SJames Hsiao 198049359d6SJames Hsiao #define SA_AES128_LEN (sizeof(struct dynamic_sa_aes128)/4) 199049359d6SJames Hsiao #define SA_AES128_CONTENTS 0x3e000042 200049359d6SJames Hsiao 201049359d6SJames Hsiao /* 202049359d6SJames Hsiao * Security Association (SA) for AES192 203049359d6SJames Hsiao */ 204049359d6SJames Hsiao struct dynamic_sa_aes192 { 205049359d6SJames Hsiao struct dynamic_sa_ctl ctrl; 206049359d6SJames Hsiao u32 key[6]; 207049359d6SJames Hsiao u32 iv[4]; /* for CBC, OFC, and CFB mode */ 208049359d6SJames Hsiao u32 state_ptr; 209049359d6SJames Hsiao u32 reserved; 210049359d6SJames Hsiao } __attribute__((packed)); 211049359d6SJames Hsiao 212049359d6SJames Hsiao #define SA_AES192_LEN (sizeof(struct dynamic_sa_aes192)/4) 213049359d6SJames Hsiao #define SA_AES192_CONTENTS 0x3e000062 214049359d6SJames Hsiao 215049359d6SJames Hsiao /** 216049359d6SJames Hsiao * Security Association (SA) for AES256 217049359d6SJames Hsiao */ 218049359d6SJames Hsiao struct dynamic_sa_aes256 { 219049359d6SJames Hsiao struct dynamic_sa_ctl ctrl; 220049359d6SJames Hsiao u32 key[8]; 221049359d6SJames Hsiao u32 iv[4]; /* for CBC, OFC, and CFB mode */ 222049359d6SJames Hsiao u32 state_ptr; 223049359d6SJames Hsiao u32 reserved; 224049359d6SJames Hsiao } __attribute__((packed)); 225049359d6SJames Hsiao 226049359d6SJames Hsiao #define SA_AES256_LEN (sizeof(struct dynamic_sa_aes256)/4) 227049359d6SJames Hsiao #define SA_AES256_CONTENTS 0x3e000082 228049359d6SJames Hsiao #define SA_AES_CONTENTS 0x3e000002 229049359d6SJames Hsiao 230049359d6SJames Hsiao /** 231049359d6SJames Hsiao * Security Association (SA) for HASH160: HMAC-SHA1 232049359d6SJames Hsiao */ 233049359d6SJames Hsiao struct dynamic_sa_hash160 { 234049359d6SJames Hsiao struct dynamic_sa_ctl ctrl; 235049359d6SJames Hsiao u32 inner_digest[5]; 236049359d6SJames Hsiao u32 outer_digest[5]; 237049359d6SJames Hsiao u32 state_ptr; 238049359d6SJames Hsiao u32 reserved; 239049359d6SJames Hsiao } __attribute__((packed)); 240049359d6SJames Hsiao #define SA_HASH160_LEN (sizeof(struct dynamic_sa_hash160)/4) 241049359d6SJames Hsiao #define SA_HASH160_CONTENTS 0x2000a502 242049359d6SJames Hsiao 243049359d6SJames Hsiao #endif 244