From 8178e71bce4b5c149857dd756eca137899b4f3a3 Mon Sep 17 00:00:00 2001
From: zhanmingkan <496160012@qq.com>
Date: 星期一, 11 五月 2026 13:51:14 +0800
Subject: [PATCH] 提交

---
 aesni-key-init.h |  105 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 105 insertions(+), 0 deletions(-)

diff --git a/aesni-key-init.h b/aesni-key-init.h
new file mode 100644
index 0000000..3fa31ad
--- /dev/null
+++ b/aesni-key-init.h
@@ -0,0 +1,105 @@
+#ifndef AESNIKEYINIT_H
+#define AESNIKEYINIT_H
+
+#if defined (__GNUC__)
+#define ALIGN16 __attribute__ ( (aligned (16)))
+#else
+#define ALIGN16 __declspec (align (16))
+#endif
+
+#include "aesni-key-exp.h"
+
+typedef struct KEY_SCHEDULE{
+    ALIGN16 unsigned char KEY[16*15];
+    unsigned int nr;
+} AES_KEY;
+
+/*!
+ * @brief AES_set_encrypt_key takes the "userKey" and computes it to an allowed AES_Encryption_Key "key" of size "bits"
+ * @param userKey
+ * @param bits
+ * @param key
+ * @return -1 if userKey or key is empty/nullptr
+ * @return 0  if encryption-key got succesfully computed
+ * @return -2 if bits didn't match 128 or 192 or 256 (allowed key sizes)
+ *
+ */
+int AES_set_encrypt_key (const unsigned char *userKey,
+                         const int bits,
+                         AES_KEY *key)
+     {
+     if (!userKey || !key)
+        return -1;
+
+     if (bits == 128)
+     {
+         AES_128_Key_Expansion (userKey,key->KEY);
+         key->nr = 10;
+         return 0;
+     }
+     else if (bits == 192)
+     {
+         AES_192_Key_Expansion (userKey,key->KEY);
+         key->nr = 12;
+         return 0;
+     }
+     else if (bits == 256)
+     {
+         AES_256_Key_Expansion (userKey,key->KEY);
+         key->nr = 14;
+         return 0;
+     }
+     return -2;
+}
+
+/*!
+ * @brief AES_set_decrypt_key takes the "userKey" and computes it to an allowed AES_Decryption_Key "key" of size "bits"
+ * @param userKey
+ * @param bits
+ * @param key
+ * @return -1 if userKey or key is empty/nullptr
+ * @return 0  if decryption-key got succesfully computed
+ * @return -2 if bits didn't match 128 or 192 or 256 (allowed key sizes)
+ *
+ */
+int AES_set_decrypt_key (const unsigned char *userKey,
+                         const int bits,
+                         AES_KEY *key)
+     {
+     int nr;
+     AES_KEY temp_key;
+     __m128i *Key_Schedule = (__m128i*)key->KEY;
+     __m128i *Temp_Key_Schedule = (__m128i*)temp_key.KEY;
+
+     if (!userKey || !key)
+        return -1;
+     if (AES_set_encrypt_key(userKey,bits,&temp_key) == -2)
+        return -2;
+
+     nr = temp_key.nr;
+     key->nr = nr;
+
+     Key_Schedule[nr] = Temp_Key_Schedule[0];
+     Key_Schedule[nr-1] = _mm_aesimc_si128(Temp_Key_Schedule[1]);
+     Key_Schedule[nr-2] = _mm_aesimc_si128(Temp_Key_Schedule[2]);
+     Key_Schedule[nr-3] = _mm_aesimc_si128(Temp_Key_Schedule[3]);
+     Key_Schedule[nr-4] = _mm_aesimc_si128(Temp_Key_Schedule[4]);
+     Key_Schedule[nr-5] = _mm_aesimc_si128(Temp_Key_Schedule[5]);
+     Key_Schedule[nr-6] = _mm_aesimc_si128(Temp_Key_Schedule[6]);
+     Key_Schedule[nr-7] = _mm_aesimc_si128(Temp_Key_Schedule[7]);
+     Key_Schedule[nr-8] = _mm_aesimc_si128(Temp_Key_Schedule[8]);
+     Key_Schedule[nr-9] = _mm_aesimc_si128(Temp_Key_Schedule[9]);
+     if(nr>10){
+         Key_Schedule[nr-10] = _mm_aesimc_si128(Temp_Key_Schedule[10]);
+         Key_Schedule[nr-11] = _mm_aesimc_si128(Temp_Key_Schedule[11]);
+     }
+     if(nr>12){
+         Key_Schedule[nr-12] = _mm_aesimc_si128(Temp_Key_Schedule[12]);
+         Key_Schedule[nr-13] = _mm_aesimc_si128(Temp_Key_Schedule[13]);
+     }
+     Key_Schedule[0] = Temp_Key_Schedule[nr];
+     return 0;
+}
+
+
+#endif // AESNIKEYINIT_H

--
Gitblit v1.9.1