Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * AMCC SoC PPC4xx Crypto Driver
0004  *
0005  * Copyright (c) 2008 Applied Micro Circuits Corporation.
0006  * All rights reserved. James Hsiao <jhsiao@amcc.com>
0007  *
0008  * This file defines the security context
0009  * associate format.
0010  */
0011 
0012 #ifndef __CRYPTO4XX_SA_H__
0013 #define __CRYPTO4XX_SA_H__
0014 
0015 #define AES_IV_SIZE             16
0016 
0017 /*
0018  * Contents of Dynamic Security Association (SA) with all possible fields
0019  */
0020 union dynamic_sa_contents {
0021     struct {
0022         u32 arc4_state_ptr:1;
0023         u32 arc4_ij_ptr:1;
0024         u32 state_ptr:1;
0025         u32 iv3:1;
0026         u32 iv2:1;
0027         u32 iv1:1;
0028         u32 iv0:1;
0029         u32 seq_num_mask3:1;
0030         u32 seq_num_mask2:1;
0031         u32 seq_num_mask1:1;
0032         u32 seq_num_mask0:1;
0033         u32 seq_num1:1;
0034         u32 seq_num0:1;
0035         u32 spi:1;
0036         u32 outer_size:5;
0037         u32 inner_size:5;
0038         u32 key_size:4;
0039         u32 cmd_size:4;
0040     } bf;
0041     u32 w;
0042 } __attribute__((packed));
0043 
0044 #define DIR_OUTBOUND                0
0045 #define DIR_INBOUND             1
0046 #define SA_OP_GROUP_BASIC           0
0047 #define SA_OPCODE_ENCRYPT           0
0048 #define SA_OPCODE_DECRYPT           0
0049 #define SA_OPCODE_ENCRYPT_HASH          1
0050 #define SA_OPCODE_HASH_DECRYPT          1
0051 #define SA_OPCODE_HASH              3
0052 #define SA_CIPHER_ALG_DES           0
0053 #define SA_CIPHER_ALG_3DES          1
0054 #define SA_CIPHER_ALG_ARC4          2
0055 #define SA_CIPHER_ALG_AES           3
0056 #define SA_CIPHER_ALG_KASUMI            4
0057 #define SA_CIPHER_ALG_NULL          15
0058 
0059 #define SA_HASH_ALG_MD5             0
0060 #define SA_HASH_ALG_SHA1            1
0061 #define SA_HASH_ALG_GHASH           12
0062 #define SA_HASH_ALG_CBC_MAC         14
0063 #define SA_HASH_ALG_NULL            15
0064 #define SA_HASH_ALG_SHA1_DIGEST_SIZE        20
0065 
0066 #define SA_LOAD_HASH_FROM_SA            0
0067 #define SA_LOAD_HASH_FROM_STATE         2
0068 #define SA_NOT_LOAD_HASH            3
0069 #define SA_LOAD_IV_FROM_SA          0
0070 #define SA_LOAD_IV_FROM_INPUT           1
0071 #define SA_LOAD_IV_FROM_STATE           2
0072 #define SA_LOAD_IV_GEN_IV           3
0073 
0074 #define SA_PAD_TYPE_CONSTANT            2
0075 #define SA_PAD_TYPE_ZERO            3
0076 #define SA_PAD_TYPE_TLS             5
0077 #define SA_PAD_TYPE_DTLS            5
0078 #define SA_NOT_SAVE_HASH            0
0079 #define SA_SAVE_HASH                1
0080 #define SA_NOT_SAVE_IV              0
0081 #define SA_SAVE_IV              1
0082 #define SA_HEADER_PROC              1
0083 #define SA_NO_HEADER_PROC           0
0084 
0085 union sa_command_0 {
0086     struct {
0087         u32 scatter:1;
0088         u32 gather:1;
0089         u32 save_hash_state:1;
0090         u32 save_iv:1;
0091         u32 load_hash_state:2;
0092         u32 load_iv:2;
0093         u32 digest_len:4;
0094         u32 hdr_proc:1;
0095         u32 extend_pad:1;
0096         u32 stream_cipher_pad:1;
0097         u32 rsv:1;
0098         u32 hash_alg:4;
0099         u32 cipher_alg:4;
0100         u32 pad_type:2;
0101         u32 op_group:2;
0102         u32 dir:1;
0103         u32 opcode:3;
0104     } bf;
0105     u32 w;
0106 } __attribute__((packed));
0107 
0108 #define CRYPTO_MODE_ECB             0
0109 #define CRYPTO_MODE_CBC             1
0110 #define CRYPTO_MODE_OFB             2
0111 #define CRYPTO_MODE_CFB             3
0112 #define CRYPTO_MODE_CTR             4
0113 
0114 #define CRYPTO_FEEDBACK_MODE_NO_FB      0
0115 #define CRYPTO_FEEDBACK_MODE_64BIT_OFB      0
0116 #define CRYPTO_FEEDBACK_MODE_8BIT_CFB       1
0117 #define CRYPTO_FEEDBACK_MODE_1BIT_CFB       2
0118 #define CRYPTO_FEEDBACK_MODE_128BIT_CFB     3
0119 
0120 #define SA_AES_KEY_LEN_128          2
0121 #define SA_AES_KEY_LEN_192          3
0122 #define SA_AES_KEY_LEN_256          4
0123 
0124 #define SA_REV2                 1
0125 /*
0126  * The follow defines bits sa_command_1
0127  * In Basic hash mode  this bit define simple hash or hmac.
0128  * In IPsec mode, this bit define muting control.
0129  */
0130 #define SA_HASH_MODE_HASH           0
0131 #define SA_HASH_MODE_HMAC           1
0132 #define SA_MC_ENABLE                0
0133 #define SA_MC_DISABLE               1
0134 #define SA_NOT_COPY_HDR             0
0135 #define SA_COPY_HDR             1
0136 #define SA_NOT_COPY_PAD             0
0137 #define SA_COPY_PAD             1
0138 #define SA_NOT_COPY_PAYLOAD         0
0139 #define SA_COPY_PAYLOAD             1
0140 #define SA_EXTENDED_SN_OFF          0
0141 #define SA_EXTENDED_SN_ON           1
0142 #define SA_SEQ_MASK_OFF             0
0143 #define SA_SEQ_MASK_ON              1
0144 
0145 union sa_command_1 {
0146     struct {
0147         u32 crypto_mode31:1;
0148         u32 save_arc4_state:1;
0149         u32 arc4_stateful:1;
0150         u32 key_len:5;
0151         u32 hash_crypto_offset:8;
0152         u32 sa_rev:2;
0153         u32 byte_offset:1;
0154         u32 hmac_muting:1;
0155         u32 feedback_mode:2;
0156         u32 crypto_mode9_8:2;
0157         u32 extended_seq_num:1;
0158         u32 seq_num_mask:1;
0159         u32 mutable_bit_proc:1;
0160         u32 ip_version:1;
0161         u32 copy_pad:1;
0162         u32 copy_payload:1;
0163         u32 copy_hdr:1;
0164         u32 rsv1:1;
0165     } bf;
0166     u32 w;
0167 } __attribute__((packed));
0168 
0169 struct dynamic_sa_ctl {
0170     union dynamic_sa_contents sa_contents;
0171     union sa_command_0 sa_command_0;
0172     union sa_command_1 sa_command_1;
0173 } __attribute__((packed));
0174 
0175 /*
0176  * State Record for Security Association (SA)
0177  */
0178 struct  sa_state_record {
0179     __le32 save_iv[4];
0180     __le32 save_hash_byte_cnt[2];
0181     union {
0182         u32 save_digest[16]; /* for MD5/SHA */
0183         __le32 save_digest_le32[16]; /* GHASH / CBC */
0184     };
0185 } __attribute__((packed));
0186 
0187 /*
0188  * Security Association (SA) for AES128
0189  *
0190  */
0191 struct dynamic_sa_aes128 {
0192     struct dynamic_sa_ctl   ctrl;
0193     __le32 key[4];
0194     __le32 iv[4]; /* for CBC, OFC, and CFB mode */
0195     u32 state_ptr;
0196     u32 reserved;
0197 } __attribute__((packed));
0198 
0199 #define SA_AES128_LEN       (sizeof(struct dynamic_sa_aes128)/4)
0200 #define SA_AES128_CONTENTS  0x3e000042
0201 
0202 /*
0203  * Security Association (SA) for AES192
0204  */
0205 struct dynamic_sa_aes192 {
0206     struct dynamic_sa_ctl ctrl;
0207     __le32 key[6];
0208     __le32 iv[4]; /* for CBC, OFC, and CFB mode */
0209     u32 state_ptr;
0210     u32 reserved;
0211 } __attribute__((packed));
0212 
0213 #define SA_AES192_LEN       (sizeof(struct dynamic_sa_aes192)/4)
0214 #define SA_AES192_CONTENTS  0x3e000062
0215 
0216 /*
0217  * Security Association (SA) for AES256
0218  */
0219 struct dynamic_sa_aes256 {
0220     struct dynamic_sa_ctl ctrl;
0221     __le32 key[8];
0222     __le32 iv[4]; /* for CBC, OFC, and CFB mode */
0223     u32 state_ptr;
0224     u32 reserved;
0225 } __attribute__((packed));
0226 
0227 #define SA_AES256_LEN       (sizeof(struct dynamic_sa_aes256)/4)
0228 #define SA_AES256_CONTENTS  0x3e000082
0229 #define SA_AES_CONTENTS     0x3e000002
0230 
0231 /*
0232  * Security Association (SA) for AES128 CCM
0233  */
0234 struct dynamic_sa_aes128_ccm {
0235     struct dynamic_sa_ctl ctrl;
0236     __le32 key[4];
0237     __le32 iv[4];
0238     u32 state_ptr;
0239     u32 reserved;
0240 } __packed;
0241 #define SA_AES128_CCM_LEN   (sizeof(struct dynamic_sa_aes128_ccm)/4)
0242 #define SA_AES128_CCM_CONTENTS  0x3e000042
0243 #define SA_AES_CCM_CONTENTS 0x3e000002
0244 
0245 /*
0246  * Security Association (SA) for AES128_GCM
0247  */
0248 struct dynamic_sa_aes128_gcm {
0249     struct dynamic_sa_ctl ctrl;
0250     __le32 key[4];
0251     __le32 inner_digest[4];
0252     __le32 iv[4];
0253     u32 state_ptr;
0254     u32 reserved;
0255 } __packed;
0256 
0257 #define SA_AES128_GCM_LEN   (sizeof(struct dynamic_sa_aes128_gcm)/4)
0258 #define SA_AES128_GCM_CONTENTS  0x3e000442
0259 #define SA_AES_GCM_CONTENTS 0x3e000402
0260 
0261 /*
0262  * Security Association (SA) for HASH160: HMAC-SHA1
0263  */
0264 struct dynamic_sa_hash160 {
0265     struct dynamic_sa_ctl ctrl;
0266     __le32 inner_digest[5];
0267     __le32 outer_digest[5];
0268     u32 state_ptr;
0269     u32 reserved;
0270 } __attribute__((packed));
0271 #define SA_HASH160_LEN      (sizeof(struct dynamic_sa_hash160)/4)
0272 #define SA_HASH160_CONTENTS     0x2000a502
0273 
0274 static inline u32
0275 get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts)
0276 {
0277     u32 offset;
0278 
0279     offset = cts->sa_contents.bf.key_size
0280         + cts->sa_contents.bf.inner_size
0281         + cts->sa_contents.bf.outer_size
0282         + cts->sa_contents.bf.spi
0283         + cts->sa_contents.bf.seq_num0
0284         + cts->sa_contents.bf.seq_num1
0285         + cts->sa_contents.bf.seq_num_mask0
0286         + cts->sa_contents.bf.seq_num_mask1
0287         + cts->sa_contents.bf.seq_num_mask2
0288         + cts->sa_contents.bf.seq_num_mask3
0289         + cts->sa_contents.bf.iv0
0290         + cts->sa_contents.bf.iv1
0291         + cts->sa_contents.bf.iv2
0292         + cts->sa_contents.bf.iv3;
0293 
0294     return sizeof(struct dynamic_sa_ctl) + offset * 4;
0295 }
0296 
0297 static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
0298 {
0299     return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
0300 }
0301 
0302 static inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
0303 {
0304     return (__le32 *) ((unsigned long)cts +
0305         sizeof(struct dynamic_sa_ctl) +
0306         cts->sa_contents.bf.key_size * 4);
0307 }
0308 
0309 #endif