aboutsummaryrefslogtreecommitdiffstats
path: root/module/icp/include/aes
diff options
context:
space:
mode:
authorNathan Lewis <[email protected]>2018-08-02 11:59:24 -0700
committerBrian Behlendorf <[email protected]>2018-08-02 11:59:24 -0700
commit010d12474cb1572c0c9b729615fa45cf43f59d14 (patch)
tree90decc0e3097d799852e8befeb7d6b8a1a5f4be8 /module/icp/include/aes
parent3d503a76e890d7711d5e906e025e092d0e244211 (diff)
Add support for selecting encryption backend
- Add two new module parameters to icp (icp_aes_impl, icp_gcm_impl) that control the crypto implementation. At the moment there is a choice between generic and aesni (on platforms that support it). - This enables support for AES-NI and PCLMULQDQ-NI on AMD Family 15h (bulldozer) and newer CPUs (zen). - Modify aes_key_t to track what implementation it was generated with as key schedules generated with various implementations are not necessarily interchangable. Reviewed by: Gvozden Neskovic <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Tom Caputi <[email protected]> Reviewed-by: Richard Laager <[email protected]> Signed-off-by: Nathaniel R. Lewis <[email protected]> Closes #7102 Closes #7103
Diffstat (limited to 'module/icp/include/aes')
-rw-r--r--module/icp/include/aes/aes_impl.h50
1 files changed, 46 insertions, 4 deletions
diff --git a/module/icp/include/aes/aes_impl.h b/module/icp/include/aes/aes_impl.h
index ed15f74e7..95cfddf9e 100644
--- a/module/icp/include/aes/aes_impl.h
+++ b/module/icp/include/aes/aes_impl.h
@@ -106,17 +106,15 @@ typedef union {
uint32_t ks32[((MAX_AES_NR) + 1) * (MAX_AES_NB)];
} aes_ks_t;
-/* aes_key.flags value: */
-#define INTEL_AES_NI_CAPABLE 0x1 /* AES-NI instructions present */
-
+typedef struct aes_impl_ops aes_impl_ops_t;
typedef struct aes_key aes_key_t;
struct aes_key {
aes_ks_t encr_ks; /* encryption key schedule */
aes_ks_t decr_ks; /* decryption key schedule */
#ifdef __amd64
long double align128; /* Align fields above for Intel AES-NI */
- int flags; /* implementation-dependent flags */
#endif /* __amd64 */
+ const aes_impl_ops_t *ops; /* ops associated with this schedule */
int nr; /* number of rounds (10, 12, or 14) */
int type; /* key schedule size (32 or 64 bits) */
};
@@ -163,6 +161,50 @@ typedef enum aes_mech_type {
#endif /* _AES_IMPL */
+/*
+ * Methods used to define aes implementation
+ *
+ * @aes_gen_f Key generation
+ * @aes_enc_f Function encrypts one block
+ * @aes_dec_f Function decrypts one block
+ * @aes_will_work_f Function tests whether method will function
+ */
+typedef void (*aes_generate_f)(aes_key_t *, const uint32_t *, int);
+typedef void (*aes_encrypt_f)(const uint32_t[], int,
+ const uint32_t[4], uint32_t[4]);
+typedef void (*aes_decrypt_f)(const uint32_t[], int,
+ const uint32_t[4], uint32_t[4]);
+typedef boolean_t (*aes_will_work_f)(void);
+
+#define AES_IMPL_NAME_MAX (16)
+
+struct aes_impl_ops {
+ aes_generate_f generate;
+ aes_encrypt_f encrypt;
+ aes_decrypt_f decrypt;
+ aes_will_work_f is_supported;
+ boolean_t needs_byteswap;
+ char name[AES_IMPL_NAME_MAX];
+};
+
+extern const aes_impl_ops_t aes_generic_impl;
+#if defined(__x86_64)
+extern const aes_impl_ops_t aes_x86_64_impl;
+#endif
+#if defined(__x86_64) && defined(HAVE_AES)
+extern const aes_impl_ops_t aes_aesni_impl;
+#endif
+
+/*
+ * Initializes fastest implementation
+ */
+void aes_impl_init(void);
+
+/*
+ * Get selected aes implementation
+ */
+struct aes_impl_ops *aes_impl_get_ops(void);
+
#ifdef __cplusplus
}
#endif