modified: myjupyterlab.sh
[GalaxyCodeBases.git] / etc / Windows / vlmcsd_old_vancepym / crypto.c
blob042bfd8046ffac8302298bcd220a394c556c62b3
1 #ifndef CONFIG
2 #define CONFIG "config.h"
3 #endif // CONFIG
4 #include CONFIG
6 #include "crypto.h"
7 #include "endian.h"
8 #include <stdint.h>
10 const BYTE AesKeyV4[] = {
11 0x05, 0x3D, 0x83, 0x07, 0xF9, 0xE5, 0xF0, 0x88, 0xEB, 0x5E, 0xA6, 0x68, 0x6C, 0xF0, 0x37, 0xC7, 0xE4, 0xEF, 0xD2, 0xD6};
13 const BYTE AesKeyV5[] = {
14 0xCD, 0x7E, 0x79, 0x6F, 0x2A, 0xB2, 0x5D, 0xCB, 0x55, 0xFF, 0xC8, 0xEF, 0x83, 0x64, 0xC4, 0x70 };
16 const BYTE AesKeyV6[] = {
17 0xA9, 0x4A, 0x41, 0x95, 0xE2, 0x01, 0x43, 0x2D, 0x9B, 0xCB, 0x46, 0x04, 0x05, 0xD8, 0x4A, 0x21 };
19 static const BYTE SBox[] = {
20 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
21 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
22 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
23 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
24 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
25 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
26 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
27 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
28 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
29 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
30 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
31 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
32 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
33 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
34 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
35 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
36 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
37 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
38 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
39 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
40 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
41 0xB0, 0x54, 0xBB, 0x16
45 void XorBlock(const BYTE *const in, const BYTE *out) // Ensure that this is always 32 bit aligned
47 /*UAA64( out, 0 ) ^= UAA64( in, 0 );
48 UAA64( out, 1 ) ^= UAA64( in, 1 );*/
50 uint_fast8_t i;
52 for (i = 0; i < AES_BLOCK_WORDS; i++)
54 ((DWORD*)out)[i] ^= ((DWORD*)in)[i];
58 #define AddRoundKey(d, rk) XorBlock((const BYTE *)rk, (const BYTE *)d)
60 #define Mul2(word) (((word & 0x7f7f7f7f) << 1) ^ (((word & 0x80808080) >> 7) * 0x1b))
61 #define Mul3(word) (Mul2(word) ^ word)
62 #define Mul4(word) (Mul2(Mul2(word)))
63 #define Mul8(word) (Mul2(Mul2(Mul2(word))))
64 #define Mul9(word) (Mul8(word) ^ word)
65 #define MulB(word) (Mul8(word) ^ Mul3(word))
66 #define MulD(word) (Mul8(word) ^ Mul4(word) ^ word)
67 #define MulE(word) (Mul8(word) ^ Mul4(word) ^ Mul2(word))
69 //32 bit Galois Multiplication (generates bigger code than Macros)
70 /*static DWORD Mul(DWORD x, DWORD y)
72 DWORD result = x, yTemp = y, log2;
74 if (!y) return 0;
76 for (log2 = 0; yTemp >>= 1; log2++ )
78 result = Mul2(result);
81 return result ^ Mul(x, y - (1 << log2));
82 }*/
85 void MixColumnsR(BYTE *restrict state)
87 uint_fast8_t i = 0;
88 for (; i < AES_BLOCK_WORDS; i++)
90 #if defined(_CRYPTO_OPENSSL) && defined(_OPENSSL_SOFTWARE) && defined(_USE_AES_FROM_OPENSSL) //Always byte swap regardless of endianess
91 DWORD word = BS32(((DWORD *) state)[i]);
92 ((DWORD *) state)[i] = BS32(MulE(word) ^ ROR32(MulB(word), 8) ^ ROR32(MulD(word), 16) ^ ROR32(Mul9(word), 24));
93 #else
94 DWORD word = LE32(((DWORD *) state)[i]);
95 ((DWORD *) state)[i] = LE32(MulE(word) ^ ROR32(MulB(word), 8) ^ ROR32(MulD(word), 16) ^ ROR32(Mul9(word), 24));
96 #endif
101 static DWORD SubDword(DWORD v)
103 BYTE *b = (BYTE *)&v;
104 uint_fast8_t i = 0;
106 for (; i < sizeof(DWORD); i++) b[i] = SBox[b[i]];
108 return v;
112 void AesInitKey(AesCtx *Ctx, const BYTE *Key, int_fast8_t IsV6, int RijndaelKeyBytes)
114 int RijndaelKeyDwords = RijndaelKeyBytes / sizeof(DWORD);
115 Ctx->rounds = (uint_fast8_t)(RijndaelKeyDwords + 6);
117 static const DWORD RCon[] = {
118 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
119 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000 };
121 uint_fast8_t i;
122 DWORD temp;
124 memcpy(Ctx->Key, Key, RijndaelKeyBytes);
126 for ( i = RijndaelKeyDwords; i < ( Ctx->rounds + 1 ) << 2; i++ )
128 temp = Ctx->Key[ i - 1 ];
130 if ( ( i % RijndaelKeyDwords ) == 0 )
131 temp = BE32( SubDword( ROR32( BE32(temp), 24) ) ^ RCon[ i / RijndaelKeyDwords ] );
133 Ctx->Key[ i ] = Ctx->Key[ i - RijndaelKeyDwords ] ^ temp;
136 if ( IsV6 )
138 BYTE *_p = (BYTE *)Ctx->Key;
140 _p[ 4 * 16 ] ^= 0x73;
141 _p[ 6 * 16 ] ^= 0x09;
142 _p[ 8 * 16 ] ^= 0xE4;
147 #if !defined(_CRYPTO_OPENSSL) || !defined(_USE_AES_FROM_OPENSSL) || defined(_OPENSSL_SOFTWARE)
148 static void SubBytes(BYTE *block)
150 uint_fast8_t i;
152 for (i = 0; i < AES_BLOCK_BYTES; i++)
153 block[i] = SBox[ block[i] ];
157 static void ShiftRows(BYTE *state)
159 BYTE bIn[AES_BLOCK_BYTES];
160 uint_fast8_t i;
162 memcpy(bIn, state, AES_BLOCK_BYTES);
163 for (i = 0; i < AES_BLOCK_BYTES; i++)
165 state[i] = bIn[(i + ((i & 3) << 2)) & 0xf];
170 static void MixColumns(BYTE *state)
172 uint_fast8_t i = 0;
173 for (; i < AES_BLOCK_WORDS; i++)
175 DWORD word = LE32(((DWORD *) state)[i]);
176 ((DWORD *) state)[i] = LE32(Mul2(word) ^ ROR32(Mul3(word), 8) ^ ROR32(word, 16) ^ ROR32(word, 24));
181 void AesEncryptBlock(const AesCtx *const Ctx, BYTE *block)
183 uint_fast8_t i;
185 for ( i = 0 ;; i += 4 )
187 AddRoundKey(block, &Ctx->Key[ i ]);
188 SubBytes(block);
189 ShiftRows(block);
191 if ( i >= ( Ctx->rounds - 1 ) << 2 ) break;
193 MixColumns(block);
196 AddRoundKey(block, &Ctx->Key[ Ctx->rounds << 2 ]);
200 void AesCmacV4(BYTE *Message, size_t MessageSize, BYTE *MacOut)
202 size_t i;
203 BYTE mac[AES_BLOCK_BYTES];
204 AesCtx Ctx;
206 AesInitKey(&Ctx, AesKeyV4, FALSE, V4_KEY_BYTES);
208 memset(mac, 0, sizeof(mac));
209 memset(Message + MessageSize, 0, AES_BLOCK_BYTES);
210 Message[MessageSize] = 0x80;
212 for (i = 0; i <= MessageSize; i += AES_BLOCK_BYTES)
214 XorBlock(Message + i, mac);
215 AesEncryptBlock(&Ctx, mac);
218 memcpy(MacOut, mac, AES_BLOCK_BYTES);
220 #endif
222 #if !defined(_CRYPTO_OPENSSL) || !defined(_USE_AES_FROM_OPENSSL)
224 static const BYTE SBoxR[] = {
225 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
226 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
227 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
228 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
229 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
230 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
231 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
232 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
233 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
234 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
235 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
236 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
237 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
238 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
239 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
240 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
241 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
242 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
243 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
244 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
245 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
246 0x55, 0x21, 0x0C, 0x7D
250 static void ShiftRowsR(BYTE *state)
252 BYTE b[AES_BLOCK_BYTES];
253 uint_fast8_t i;
255 memcpy(b, state, AES_BLOCK_BYTES);
257 for (i = 0; i < AES_BLOCK_BYTES; i++)
258 state[i] = b[(i - ((i & 0x3) << 2)) & 0xf];
262 static void SubBytesR(BYTE *block)
264 uint_fast8_t i;
266 for (i = 0; i < AES_BLOCK_BYTES; i++)
267 block[i] = SBoxR[ block[i] ];
271 void AesEncryptCbc(const AesCtx *const Ctx, BYTE *restrict iv, BYTE *restrict data, size_t *restrict len)
273 // Pad up to blocksize inclusive
274 size_t i;
275 uint_fast8_t pad = (~*len & (AES_BLOCK_BYTES - 1)) + 1;
277 #if defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ == 8) // gcc 4.8 memset bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56977
278 for (i = 0; i < pad; i++) data[*len + i] = pad;
279 #else
280 memset(data + *len, pad, pad);
281 #endif
282 *len += pad;
284 if ( iv ) XorBlock(iv, data);
285 AesEncryptBlock(Ctx, data);
287 for (i = *len - AES_BLOCK_BYTES; i; i -= AES_BLOCK_BYTES)
289 XorBlock(data, data + AES_BLOCK_BYTES);
290 data += AES_BLOCK_BYTES;
291 AesEncryptBlock(Ctx, data);
296 void AesDecryptBlock(const AesCtx *const Ctx, BYTE *block)
298 uint_fast8_t i;
300 AddRoundKey(block, &Ctx->Key[ Ctx->rounds << 2 ]);
302 for ( i = ( Ctx->rounds - 1 ) << 2 ;; i -= 4 )
304 ShiftRowsR(block);
305 SubBytesR(block);
306 AddRoundKey(block, &Ctx->Key[ i ]);
308 if ( i == 0 ) break;
310 MixColumnsR(block);
315 void AesDecryptCbc(const AesCtx *const Ctx, BYTE *iv, BYTE *data, size_t len)
317 BYTE *cc;
319 for (cc = data + len - AES_BLOCK_BYTES; cc > data; cc -= AES_BLOCK_BYTES)
321 AesDecryptBlock(Ctx, cc);
322 XorBlock(cc - AES_BLOCK_BYTES, cc);
325 AesDecryptBlock(Ctx, cc);
326 if ( iv ) XorBlock(iv, cc);
328 #endif // _CRYPTO_OPENSSL || OPENSSL_VERSION_NUMBER < 0x10000000L