linux/drivers/crypto/amcc/crypto4xx_sa.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/**
   3 * AMCC SoC PPC4xx Crypto Driver
   4 *
   5 * Copyright (c) 2008 Applied Micro Circuits Corporation.
   6 * All rights reserved. James Hsiao <jhsiao@amcc.com>
   7 *
   8 * This file defines the security context
   9 * associate format.
  10 */
  11
  12#ifndef __CRYPTO4XX_SA_H__
  13#define __CRYPTO4XX_SA_H__
  14
  15#define AES_IV_SIZE                             16
  16
  17/**
  18 * Contents of Dynamic Security Association (SA) with all possible fields
  19 */
  20union dynamic_sa_contents {
  21        struct {
  22                u32 arc4_state_ptr:1;
  23                u32 arc4_ij_ptr:1;
  24                u32 state_ptr:1;
  25                u32 iv3:1;
  26                u32 iv2:1;
  27                u32 iv1:1;
  28                u32 iv0:1;
  29                u32 seq_num_mask3:1;
  30                u32 seq_num_mask2:1;
  31                u32 seq_num_mask1:1;
  32                u32 seq_num_mask0:1;
  33                u32 seq_num1:1;
  34                u32 seq_num0:1;
  35                u32 spi:1;
  36                u32 outer_size:5;
  37                u32 inner_size:5;
  38                u32 key_size:4;
  39                u32 cmd_size:4;
  40        } bf;
  41        u32 w;
  42} __attribute__((packed));
  43
  44#define DIR_OUTBOUND                            0
  45#define DIR_INBOUND                             1
  46#define SA_OP_GROUP_BASIC                       0
  47#define SA_OPCODE_ENCRYPT                       0
  48#define SA_OPCODE_DECRYPT                       0
  49#define SA_OPCODE_ENCRYPT_HASH                  1
  50#define SA_OPCODE_HASH_DECRYPT                  1
  51#define SA_OPCODE_HASH                          3
  52#define SA_CIPHER_ALG_DES                       0
  53#define SA_CIPHER_ALG_3DES                      1
  54#define SA_CIPHER_ALG_ARC4                      2
  55#define SA_CIPHER_ALG_AES                       3
  56#define SA_CIPHER_ALG_KASUMI                    4
  57#define SA_CIPHER_ALG_NULL                      15
  58
  59#define SA_HASH_ALG_MD5                         0
  60#define SA_HASH_ALG_SHA1                        1
  61#define SA_HASH_ALG_GHASH                       12
  62#define SA_HASH_ALG_CBC_MAC                     14
  63#define SA_HASH_ALG_NULL                        15
  64#define SA_HASH_ALG_SHA1_DIGEST_SIZE            20
  65
  66#define SA_LOAD_HASH_FROM_SA                    0
  67#define SA_LOAD_HASH_FROM_STATE                 2
  68#define SA_NOT_LOAD_HASH                        3
  69#define SA_LOAD_IV_FROM_SA                      0
  70#define SA_LOAD_IV_FROM_INPUT                   1
  71#define SA_LOAD_IV_FROM_STATE                   2
  72#define SA_LOAD_IV_GEN_IV                       3
  73
  74#define SA_PAD_TYPE_CONSTANT                    2
  75#define SA_PAD_TYPE_ZERO                        3
  76#define SA_PAD_TYPE_TLS                         5
  77#define SA_PAD_TYPE_DTLS                        5
  78#define SA_NOT_SAVE_HASH                        0
  79#define SA_SAVE_HASH                            1
  80#define SA_NOT_SAVE_IV                          0
  81#define SA_SAVE_IV                              1
  82#define SA_HEADER_PROC                          1
  83#define SA_NO_HEADER_PROC                       0
  84
  85union sa_command_0 {
  86        struct {
  87                u32 scatter:1;
  88                u32 gather:1;
  89                u32 save_hash_state:1;
  90                u32 save_iv:1;
  91                u32 load_hash_state:2;
  92                u32 load_iv:2;
  93                u32 digest_len:4;
  94                u32 hdr_proc:1;
  95                u32 extend_pad:1;
  96                u32 stream_cipher_pad:1;
  97                u32 rsv:1;
  98                u32 hash_alg:4;
  99                u32 cipher_alg:4;
 100                u32 pad_type:2;
 101                u32 op_group:2;
 102                u32 dir:1;
 103                u32 opcode:3;
 104        } bf;
 105        u32 w;
 106} __attribute__((packed));
 107
 108#define CRYPTO_MODE_ECB                         0
 109#define CRYPTO_MODE_CBC                         1
 110#define CRYPTO_MODE_OFB                         2
 111#define CRYPTO_MODE_CFB                         3
 112#define CRYPTO_MODE_CTR                         4
 113
 114#define CRYPTO_FEEDBACK_MODE_NO_FB              0
 115#define CRYPTO_FEEDBACK_MODE_64BIT_OFB          0
 116#define CRYPTO_FEEDBACK_MODE_8BIT_CFB           1
 117#define CRYPTO_FEEDBACK_MODE_1BIT_CFB           2
 118#define CRYPTO_FEEDBACK_MODE_128BIT_CFB         3
 119
 120#define SA_AES_KEY_LEN_128                      2
 121#define SA_AES_KEY_LEN_192                      3
 122#define SA_AES_KEY_LEN_256                      4
 123
 124#define SA_REV2                                 1
 125/**
 126 * The follow defines bits sa_command_1
 127 * In Basic hash mode  this bit define simple hash or hmac.
 128 * In IPsec mode, this bit define muting control.
 129 */
 130#define SA_HASH_MODE_HASH                       0
 131#define SA_HASH_MODE_HMAC                       1
 132#define SA_MC_ENABLE                            0
 133#define SA_MC_DISABLE                           1
 134#define SA_NOT_COPY_HDR                         0
 135#define SA_COPY_HDR                             1
 136#define SA_NOT_COPY_PAD                         0
 137#define SA_COPY_PAD                             1
 138#define SA_NOT_COPY_PAYLOAD                     0
 139#define SA_COPY_PAYLOAD                         1
 140#define SA_EXTENDED_SN_OFF                      0
 141#define SA_EXTENDED_SN_ON                       1
 142#define SA_SEQ_MASK_OFF                         0
 143#define SA_SEQ_MASK_ON                          1
 144
 145union sa_command_1 {
 146        struct {
 147                u32 crypto_mode31:1;
 148                u32 save_arc4_state:1;
 149                u32 arc4_stateful:1;
 150                u32 key_len:5;
 151                u32 hash_crypto_offset:8;
 152                u32 sa_rev:2;
 153                u32 byte_offset:1;
 154                u32 hmac_muting:1;
 155                u32 feedback_mode:2;
 156                u32 crypto_mode9_8:2;
 157                u32 extended_seq_num:1;
 158                u32 seq_num_mask:1;
 159                u32 mutable_bit_proc:1;
 160                u32 ip_version:1;
 161                u32 copy_pad:1;
 162                u32 copy_payload:1;
 163                u32 copy_hdr:1;
 164                u32 rsv1:1;
 165        } bf;
 166        u32 w;
 167} __attribute__((packed));
 168
 169struct dynamic_sa_ctl {
 170        union dynamic_sa_contents sa_contents;
 171        union sa_command_0 sa_command_0;
 172        union sa_command_1 sa_command_1;
 173} __attribute__((packed));
 174
 175/**
 176 * State Record for Security Association (SA)
 177 */
 178struct  sa_state_record {
 179        __le32 save_iv[4];
 180        __le32 save_hash_byte_cnt[2];
 181        union {
 182                u32 save_digest[16]; /* for MD5/SHA */
 183                __le32 save_digest_le32[16]; /* GHASH / CBC */
 184        };
 185} __attribute__((packed));
 186
 187/**
 188 * Security Association (SA) for AES128
 189 *
 190 */
 191struct dynamic_sa_aes128 {
 192        struct dynamic_sa_ctl   ctrl;
 193        __le32 key[4];
 194        __le32 iv[4]; /* for CBC, OFC, and CFB mode */
 195        u32 state_ptr;
 196        u32 reserved;
 197} __attribute__((packed));
 198
 199#define SA_AES128_LEN           (sizeof(struct dynamic_sa_aes128)/4)
 200#define SA_AES128_CONTENTS      0x3e000042
 201
 202/*
 203 * Security Association (SA) for AES192
 204 */
 205struct dynamic_sa_aes192 {
 206        struct dynamic_sa_ctl ctrl;
 207        __le32 key[6];
 208        __le32 iv[4]; /* for CBC, OFC, and CFB mode */
 209        u32 state_ptr;
 210        u32 reserved;
 211} __attribute__((packed));
 212
 213#define SA_AES192_LEN           (sizeof(struct dynamic_sa_aes192)/4)
 214#define SA_AES192_CONTENTS      0x3e000062
 215
 216/**
 217 * Security Association (SA) for AES256
 218 */
 219struct dynamic_sa_aes256 {
 220        struct dynamic_sa_ctl ctrl;
 221        __le32 key[8];
 222        __le32 iv[4]; /* for CBC, OFC, and CFB mode */
 223        u32 state_ptr;
 224        u32 reserved;
 225} __attribute__((packed));
 226
 227#define SA_AES256_LEN           (sizeof(struct dynamic_sa_aes256)/4)
 228#define SA_AES256_CONTENTS      0x3e000082
 229#define SA_AES_CONTENTS         0x3e000002
 230
 231/**
 232 * Security Association (SA) for AES128 CCM
 233 */
 234struct dynamic_sa_aes128_ccm {
 235        struct dynamic_sa_ctl ctrl;
 236        __le32 key[4];
 237        __le32 iv[4];
 238        u32 state_ptr;
 239        u32 reserved;
 240} __packed;
 241#define SA_AES128_CCM_LEN       (sizeof(struct dynamic_sa_aes128_ccm)/4)
 242#define SA_AES128_CCM_CONTENTS  0x3e000042
 243#define SA_AES_CCM_CONTENTS     0x3e000002
 244
 245/**
 246 * Security Association (SA) for AES128_GCM
 247 */
 248struct dynamic_sa_aes128_gcm {
 249        struct dynamic_sa_ctl ctrl;
 250        __le32 key[4];
 251        __le32 inner_digest[4];
 252        __le32 iv[4];
 253        u32 state_ptr;
 254        u32 reserved;
 255} __packed;
 256
 257#define SA_AES128_GCM_LEN       (sizeof(struct dynamic_sa_aes128_gcm)/4)
 258#define SA_AES128_GCM_CONTENTS  0x3e000442
 259#define SA_AES_GCM_CONTENTS     0x3e000402
 260
 261/**
 262 * Security Association (SA) for HASH160: HMAC-SHA1
 263 */
 264struct dynamic_sa_hash160 {
 265        struct dynamic_sa_ctl ctrl;
 266        __le32 inner_digest[5];
 267        __le32 outer_digest[5];
 268        u32 state_ptr;
 269        u32 reserved;
 270} __attribute__((packed));
 271#define SA_HASH160_LEN          (sizeof(struct dynamic_sa_hash160)/4)
 272#define SA_HASH160_CONTENTS     0x2000a502
 273
 274static inline u32
 275get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts)
 276{
 277        u32 offset;
 278
 279        offset = cts->sa_contents.bf.key_size
 280                + cts->sa_contents.bf.inner_size
 281                + cts->sa_contents.bf.outer_size
 282                + cts->sa_contents.bf.spi
 283                + cts->sa_contents.bf.seq_num0
 284                + cts->sa_contents.bf.seq_num1
 285                + cts->sa_contents.bf.seq_num_mask0
 286                + cts->sa_contents.bf.seq_num_mask1
 287                + cts->sa_contents.bf.seq_num_mask2
 288                + cts->sa_contents.bf.seq_num_mask3
 289                + cts->sa_contents.bf.iv0
 290                + cts->sa_contents.bf.iv1
 291                + cts->sa_contents.bf.iv2
 292                + cts->sa_contents.bf.iv3;
 293
 294        return sizeof(struct dynamic_sa_ctl) + offset * 4;
 295}
 296
 297static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
 298{
 299        return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
 300}
 301
 302static inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
 303{
 304        return (__le32 *) ((unsigned long)cts +
 305                sizeof(struct dynamic_sa_ctl) +
 306                cts->sa_contents.bf.key_size * 4);
 307}
 308
 309#endif
 310