³ɳ¿Òâ
2026-05-14 342f873fa3204558511dae71ff82b7f73438b8f5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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