diff options
author | Christian Lamparter <chunkeey@gmail.com> | 2017-10-04 01:00:10 +0200 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-10-12 22:55:13 +0800 |
commit | 4865b122d4aff5151c88d2f7442d5a87f7e795ae (patch) | |
tree | 05ba3a955b3438d9229b8ff761350acb9aa234e9 /drivers/crypto/amcc/crypto4xx_sa.h | |
parent | 8ef8d195430ca3542d0434cf25e5115484b9fa32 (diff) | |
download | linux-4865b122d4aff5151c88d2f7442d5a87f7e795ae.tar.gz linux-4865b122d4aff5151c88d2f7442d5a87f7e795ae.tar.bz2 linux-4865b122d4aff5151c88d2f7442d5a87f7e795ae.zip |
crypto: crypto4xx - use the correct LE32 format for IV and key defs
The hardware expects that the keys, IVs (and inner/outer hashes)
are in the le32 format.
This patch changes all hardware interface declarations to use
the correct LE32 data format for each field.
In order to pass __CHECK_ENDIAN__ checks, crypto4xx_memcpy_le
has to be honest about the endianness of its parameters.
The function was split and moved to the common crypto4xx_core.h
header. This allows the compiler to generate better code if the
sizes/len is a constant (various *_IV_LEN).
Please note that the hardware isn't consistent with the endiannes
of the save_digest field in the state record struct though.
The hashes produced by GHASH and CBC (for CCM) will be in LE32.
Whereas md5 and sha{1/,256,...} do not need any conversion.
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/amcc/crypto4xx_sa.h')
-rw-r--r-- | drivers/crypto/amcc/crypto4xx_sa.h | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/drivers/crypto/amcc/crypto4xx_sa.h b/drivers/crypto/amcc/crypto4xx_sa.h index 8040c82dc354..b79da98dc9a9 100644 --- a/drivers/crypto/amcc/crypto4xx_sa.h +++ b/drivers/crypto/amcc/crypto4xx_sa.h @@ -181,9 +181,12 @@ struct dynamic_sa_ctl { * State Record for Security Association (SA) */ struct sa_state_record { - u32 save_iv[4]; - u32 save_hash_byte_cnt[2]; - u32 save_digest[16]; + __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)); /** @@ -192,8 +195,8 @@ struct sa_state_record { */ struct dynamic_sa_aes128 { struct dynamic_sa_ctl ctrl; - u32 key[4]; - u32 iv[4]; /* for CBC, OFC, and CFB mode */ + __le32 key[4]; + __le32 iv[4]; /* for CBC, OFC, and CFB mode */ u32 state_ptr; u32 reserved; } __attribute__((packed)); @@ -206,8 +209,8 @@ struct dynamic_sa_aes128 { */ struct dynamic_sa_aes192 { struct dynamic_sa_ctl ctrl; - u32 key[6]; - u32 iv[4]; /* for CBC, OFC, and CFB mode */ + __le32 key[6]; + __le32 iv[4]; /* for CBC, OFC, and CFB mode */ u32 state_ptr; u32 reserved; } __attribute__((packed)); @@ -220,8 +223,8 @@ struct dynamic_sa_aes192 { */ struct dynamic_sa_aes256 { struct dynamic_sa_ctl ctrl; - u32 key[8]; - u32 iv[4]; /* for CBC, OFC, and CFB mode */ + __le32 key[8]; + __le32 iv[4]; /* for CBC, OFC, and CFB mode */ u32 state_ptr; u32 reserved; } __attribute__((packed)); @@ -235,8 +238,8 @@ struct dynamic_sa_aes256 { */ struct dynamic_sa_hash160 { struct dynamic_sa_ctl ctrl; - u32 inner_digest[5]; - u32 outer_digest[5]; + __le32 inner_digest[5]; + __le32 outer_digest[5]; u32 state_ptr; u32 reserved; } __attribute__((packed)); @@ -266,9 +269,9 @@ get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts) return sizeof(struct dynamic_sa_ctl) + offset * 4; } -static inline u32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts) +static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts) { - return (u32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl)); + return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl)); } #endif |