Print this page
5072963 Need an optimized AES implementation for amd64
@@ -24,22 +24,30 @@
*/
#ifndef _AES_IMPL_H
#define _AES_IMPL_H
-#pragma ident "@(#)aes_impl.h 1.3 08/02/26 SMI"
+#pragma ident "@(#)aes_impl.h 1.4 08/05/19 SMI"
/*
* Common definitions used by AES.
*/
#ifdef __cplusplus
extern "C" {
#endif
-#define AES_BLOCK_LEN 16
+#include <sys/types.h>
+/* Similar to sysmacros.h IS_P2ALIGNED, but checks two pointers: */
+#define IS_P2ALIGNED2(v, w, a) \
+ ((((uintptr_t)(v) | (uintptr_t)(w)) & ((uintptr_t)(a) - 1)) == 0)
+
+#define AES_BLOCK_LEN 16 /* bytes */
+/* Round constant length, in number of 32-bit elements: */
+#define RC_LENGTH (5 * ((AES_BLOCK_LEN) / 4 - 2))
+
#define AES_COPY_BLOCK(src, dst) \
(dst)[0] = (src)[0]; \
(dst)[1] = (src)[1]; \
(dst)[2] = (src)[2]; \
(dst)[3] = (src)[3]; \
@@ -72,28 +80,33 @@
(dst)[12] ^= (src)[12]; \
(dst)[13] ^= (src)[13]; \
(dst)[14] ^= (src)[14]; \
(dst)[15] ^= (src)[15]
+/* AES key size definitions */
#define AES_MINBITS 128
-#define AES_MINBYTES (AES_MINBITS >> 3)
+#define AES_MINBYTES ((AES_MINBITS) >> 3)
#define AES_MAXBITS 256
-#define AES_MAXBYTES (AES_MAXBITS >> 3)
+#define AES_MAXBYTES ((AES_MAXBITS) >> 3)
-#define AES_MIN_KEY_BYTES (AES_MINBITS >> 3)
-#define AES_MAX_KEY_BYTES (AES_MAXBITS >> 3)
+#define AES_MIN_KEY_BYTES ((AES_MINBITS) >> 3)
+#define AES_MAX_KEY_BYTES ((AES_MAXBITS) >> 3)
#define AES_192_KEY_BYTES 24
#define AES_IV_LEN 16
+/* AES key schedule may be implemented with 32- or 64-bit elements: */
#define AES_32BIT_KS 32
#define AES_64BIT_KS 64
-#define MAX_AES_NR 14
+#define MAX_AES_NR 14 /* Maximum number of rounds */
+#define MAX_AES_NB 4 /* Number of columns comprising a state */
typedef union {
- uint64_t ks64[(MAX_AES_NR + 1) * 4];
- uint32_t ks32[(MAX_AES_NR + 1) * 4];
+#ifdef sun4u
+ uint64_t ks64[((MAX_AES_NR) + 1) * (MAX_AES_NB)];
+#endif
+ uint32_t ks32[((MAX_AES_NR) + 1) * (MAX_AES_NB)];
} aes_ks_t;
typedef struct aes_key aes_key_t;
struct aes_key {
int nr;
@@ -100,18 +113,15 @@
int type;
aes_ks_t encr_ks;
aes_ks_t decr_ks;
};
-extern void aes_encrypt_block(void *, uint8_t *, uint8_t *);
-extern void aes_decrypt_block(void *, uint8_t *, uint8_t *);
-extern void aes_init_keysched(uint8_t *, uint_t, void *);
-extern void *aes_alloc_keysched(size_t *, int);
-extern void aes_encrypt_impl(const aes_ks_t *ks, int Nr, const uint32_t pt[4],
- uint32_t ct[4]);
-extern void aes_decrypt_impl(const aes_ks_t *ks, int Nr, const uint32_t ct[4],
- uint32_t pt[4]);
+extern void aes_encrypt_block(const void *ks, const uint8_t *pt, uint8_t *ct);
+extern void aes_decrypt_block(const void *ks, const uint8_t *ct, uint8_t *pt);
+extern void aes_init_keysched(const uint8_t *cipherKey, uint_t keyBits,
+ void *keysched);
+extern void *aes_alloc_keysched(size_t *size, int kmflag);
#ifdef __cplusplus
}
#endif