root/drivers/crypto/amcc/crypto4xx_sa.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * AMCC SoC PPC4xx Crypto Driver
 *
 * Copyright (c) 2008 Applied Micro Circuits Corporation.
 * All rights reserved. James Hsiao <jhsiao@amcc.com>
 *
 * This file defines the security context
 * associate format.
 */

#ifndef __CRYPTO4XX_SA_H__
#define __CRYPTO4XX_SA_H__

#define AES_IV_SIZE                             16

/*
 * Contents of Dynamic Security Association (SA) with all possible fields
 */
union dynamic_sa_contents {
        struct {
                u32 arc4_state_ptr:1;
                u32 arc4_ij_ptr:1;
                u32 state_ptr:1;
                u32 iv3:1;
                u32 iv2:1;
                u32 iv1:1;
                u32 iv0:1;
                u32 seq_num_mask3:1;
                u32 seq_num_mask2:1;
                u32 seq_num_mask1:1;
                u32 seq_num_mask0:1;
                u32 seq_num1:1;
                u32 seq_num0:1;
                u32 spi:1;
                u32 outer_size:5;
                u32 inner_size:5;
                u32 key_size:4;
                u32 cmd_size:4;
        } bf;
        u32 w;
} __attribute__((packed));

#define DIR_OUTBOUND                            0
#define DIR_INBOUND                             1
#define SA_OP_GROUP_BASIC                       0
#define SA_OPCODE_ENCRYPT                       0
#define SA_OPCODE_DECRYPT                       0
#define SA_OPCODE_ENCRYPT_HASH                  1
#define SA_OPCODE_HASH_DECRYPT                  1
#define SA_OPCODE_HASH                          3
#define SA_CIPHER_ALG_DES                       0
#define SA_CIPHER_ALG_3DES                      1
#define SA_CIPHER_ALG_ARC4                      2
#define SA_CIPHER_ALG_AES                       3
#define SA_CIPHER_ALG_KASUMI                    4
#define SA_CIPHER_ALG_NULL                      15

#define SA_HASH_ALG_MD5                         0
#define SA_HASH_ALG_SHA1                        1
#define SA_HASH_ALG_GHASH                       12
#define SA_HASH_ALG_CBC_MAC                     14
#define SA_HASH_ALG_NULL                        15
#define SA_HASH_ALG_SHA1_DIGEST_SIZE            20

#define SA_LOAD_HASH_FROM_SA                    0
#define SA_LOAD_HASH_FROM_STATE                 2
#define SA_NOT_LOAD_HASH                        3
#define SA_LOAD_IV_FROM_SA                      0
#define SA_LOAD_IV_FROM_INPUT                   1
#define SA_LOAD_IV_FROM_STATE                   2
#define SA_LOAD_IV_GEN_IV                       3

#define SA_PAD_TYPE_CONSTANT                    2
#define SA_PAD_TYPE_ZERO                        3
#define SA_PAD_TYPE_TLS                         5
#define SA_PAD_TYPE_DTLS                        5
#define SA_NOT_SAVE_HASH                        0
#define SA_SAVE_HASH                            1
#define SA_NOT_SAVE_IV                          0
#define SA_SAVE_IV                              1
#define SA_HEADER_PROC                          1
#define SA_NO_HEADER_PROC                       0

union sa_command_0 {
        struct {
                u32 scatter:1;
                u32 gather:1;
                u32 save_hash_state:1;
                u32 save_iv:1;
                u32 load_hash_state:2;
                u32 load_iv:2;
                u32 digest_len:4;
                u32 hdr_proc:1;
                u32 extend_pad:1;
                u32 stream_cipher_pad:1;
                u32 rsv:1;
                u32 hash_alg:4;
                u32 cipher_alg:4;
                u32 pad_type:2;
                u32 op_group:2;
                u32 dir:1;
                u32 opcode:3;
        } bf;
        u32 w;
} __attribute__((packed));

#define CRYPTO_MODE_ECB                         0
#define CRYPTO_MODE_CBC                         1
#define CRYPTO_MODE_OFB                         2
#define CRYPTO_MODE_CFB                         3
#define CRYPTO_MODE_CTR                         4

#define CRYPTO_FEEDBACK_MODE_NO_FB              0
#define CRYPTO_FEEDBACK_MODE_64BIT_OFB          0
#define CRYPTO_FEEDBACK_MODE_8BIT_CFB           1
#define CRYPTO_FEEDBACK_MODE_1BIT_CFB           2
#define CRYPTO_FEEDBACK_MODE_128BIT_CFB         3

#define SA_AES_KEY_LEN_128                      2
#define SA_AES_KEY_LEN_192                      3
#define SA_AES_KEY_LEN_256                      4

#define SA_REV2                                 1
/*
 * The follow defines bits sa_command_1
 * In Basic hash mode  this bit define simple hash or hmac.
 * In IPsec mode, this bit define muting control.
 */
#define SA_HASH_MODE_HASH                       0
#define SA_HASH_MODE_HMAC                       1
#define SA_MC_ENABLE                            0
#define SA_MC_DISABLE                           1
#define SA_NOT_COPY_HDR                         0
#define SA_COPY_HDR                             1
#define SA_NOT_COPY_PAD                         0
#define SA_COPY_PAD                             1
#define SA_NOT_COPY_PAYLOAD                     0
#define SA_COPY_PAYLOAD                         1
#define SA_EXTENDED_SN_OFF                      0
#define SA_EXTENDED_SN_ON                       1
#define SA_SEQ_MASK_OFF                         0
#define SA_SEQ_MASK_ON                          1

union sa_command_1 {
        struct {
                u32 crypto_mode31:1;
                u32 save_arc4_state:1;
                u32 arc4_stateful:1;
                u32 key_len:5;
                u32 hash_crypto_offset:8;
                u32 sa_rev:2;
                u32 byte_offset:1;
                u32 hmac_muting:1;
                u32 feedback_mode:2;
                u32 crypto_mode9_8:2;
                u32 extended_seq_num:1;
                u32 seq_num_mask:1;
                u32 mutable_bit_proc:1;
                u32 ip_version:1;
                u32 copy_pad:1;
                u32 copy_payload:1;
                u32 copy_hdr:1;
                u32 rsv1:1;
        } bf;
        u32 w;
} __attribute__((packed));

struct dynamic_sa_ctl {
        union dynamic_sa_contents sa_contents;
        union sa_command_0 sa_command_0;
        union sa_command_1 sa_command_1;
} __attribute__((packed));

/*
 * State Record for Security Association (SA)
 */
struct  sa_state_record {
        __le32 save_iv[4];
        __le32 save_hash_byte_cnt[2];
        union {
                u32 save_digest[16]; /* for MD5/SHA */
                __le32 save_digest_le32[16]; /* GHASH / CBC */
        };
} __attribute__((packed));

/*
 * Security Association (SA) for AES128
 *
 */
struct dynamic_sa_aes128 {
        struct dynamic_sa_ctl   ctrl;
        __le32 key[4];
        __le32 iv[4]; /* for CBC, OFC, and CFB mode */
        u32 state_ptr;
        u32 reserved;
} __attribute__((packed));

#define SA_AES128_LEN           (sizeof(struct dynamic_sa_aes128)/4)
#define SA_AES128_CONTENTS      0x3e000042

/*
 * Security Association (SA) for AES192
 */
struct dynamic_sa_aes192 {
        struct dynamic_sa_ctl ctrl;
        __le32 key[6];
        __le32 iv[4]; /* for CBC, OFC, and CFB mode */
        u32 state_ptr;
        u32 reserved;
} __attribute__((packed));

#define SA_AES192_LEN           (sizeof(struct dynamic_sa_aes192)/4)
#define SA_AES192_CONTENTS      0x3e000062

/*
 * Security Association (SA) for AES256
 */
struct dynamic_sa_aes256 {
        struct dynamic_sa_ctl ctrl;
        __le32 key[8];
        __le32 iv[4]; /* for CBC, OFC, and CFB mode */
        u32 state_ptr;
        u32 reserved;
} __attribute__((packed));

#define SA_AES256_LEN           (sizeof(struct dynamic_sa_aes256)/4)
#define SA_AES256_CONTENTS      0x3e000082
#define SA_AES_CONTENTS         0x3e000002

/*
 * Security Association (SA) for AES128 CCM
 */
struct dynamic_sa_aes128_ccm {
        struct dynamic_sa_ctl ctrl;
        __le32 key[4];
        __le32 iv[4];
        u32 state_ptr;
        u32 reserved;
} __packed;
#define SA_AES128_CCM_LEN       (sizeof(struct dynamic_sa_aes128_ccm)/4)
#define SA_AES128_CCM_CONTENTS  0x3e000042
#define SA_AES_CCM_CONTENTS     0x3e000002

/*
 * Security Association (SA) for AES128_GCM
 */
struct dynamic_sa_aes128_gcm {
        struct dynamic_sa_ctl ctrl;
        __le32 key[4];
        __le32 inner_digest[4];
        __le32 iv[4];
        u32 state_ptr;
        u32 reserved;
} __packed;

#define SA_AES128_GCM_LEN       (sizeof(struct dynamic_sa_aes128_gcm)/4)
#define SA_AES128_GCM_CONTENTS  0x3e000442
#define SA_AES_GCM_CONTENTS     0x3e000402

/*
 * Security Association (SA) for HASH160: HMAC-SHA1
 */
struct dynamic_sa_hash160 {
        struct dynamic_sa_ctl ctrl;
        __le32 inner_digest[5];
        __le32 outer_digest[5];
        u32 state_ptr;
        u32 reserved;
} __attribute__((packed));
#define SA_HASH160_LEN          (sizeof(struct dynamic_sa_hash160)/4)
#define SA_HASH160_CONTENTS     0x2000a502

static inline u32
get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts)
{
        u32 offset;

        offset = cts->sa_contents.bf.key_size
                + cts->sa_contents.bf.inner_size
                + cts->sa_contents.bf.outer_size
                + cts->sa_contents.bf.spi
                + cts->sa_contents.bf.seq_num0
                + cts->sa_contents.bf.seq_num1
                + cts->sa_contents.bf.seq_num_mask0
                + cts->sa_contents.bf.seq_num_mask1
                + cts->sa_contents.bf.seq_num_mask2
                + cts->sa_contents.bf.seq_num_mask3
                + cts->sa_contents.bf.iv0
                + cts->sa_contents.bf.iv1
                + cts->sa_contents.bf.iv2
                + cts->sa_contents.bf.iv3;

        return sizeof(struct dynamic_sa_ctl) + offset * 4;
}

static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
{
        return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
}

static inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
{
        return (__le32 *) ((unsigned long)cts +
                sizeof(struct dynamic_sa_ctl) +
                cts->sa_contents.bf.key_size * 4);
}

#endif