pq_crypto-seal 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +66 -0
  3. data/CHANGELOG.md +44 -0
  4. data/FORMAT.md +139 -0
  5. data/GET_STARTED.md +30 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +215 -0
  9. data/RELEASING.md +34 -0
  10. data/Rakefile +19 -0
  11. data/SECURITY.md +85 -0
  12. data/VENDORING.md +14 -0
  13. data/ext/pq_crypto_seal/aegis_unused_stubs.c +20 -0
  14. data/ext/pq_crypto_seal/extconf.rb +296 -0
  15. data/ext/pq_crypto_seal/pq_crypto_seal.c +390 -0
  16. data/ext/pq_crypto_seal/vendor/libaegis/LICENSE +21 -0
  17. data/ext/pq_crypto_seal/vendor/libaegis/TREE_SHA256 +1 -0
  18. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l.c +246 -0
  19. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_aesni.c +73 -0
  20. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_aesni.h +9 -0
  21. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_altivec.c +70 -0
  22. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_altivec.h +9 -0
  23. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_common.h +691 -0
  24. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_neon_aes.c +77 -0
  25. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_neon_aes.h +9 -0
  26. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_neon_sha3.c +86 -0
  27. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_neon_sha3.h +9 -0
  28. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_soft.c +63 -0
  29. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_soft.h +9 -0
  30. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/implementations.h +40 -0
  31. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2.c +247 -0
  32. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_aesni.c +108 -0
  33. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_aesni.h +9 -0
  34. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_altivec.c +103 -0
  35. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_altivec.h +9 -0
  36. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_avx2.c +79 -0
  37. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_avx2.h +11 -0
  38. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_common.h +795 -0
  39. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_neon_aes.c +111 -0
  40. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_neon_aes.h +9 -0
  41. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_soft.c +96 -0
  42. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_soft.h +9 -0
  43. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/implementations.h +40 -0
  44. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4.c +252 -0
  45. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_aesni.c +117 -0
  46. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_aesni.h +9 -0
  47. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_altivec.c +111 -0
  48. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_altivec.h +9 -0
  49. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_avx2.c +112 -0
  50. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_avx2.h +11 -0
  51. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_avx512.c +85 -0
  52. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_avx512.h +11 -0
  53. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_common.h +808 -0
  54. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_neon_aes.c +119 -0
  55. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_neon_aes.h +9 -0
  56. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_soft.c +104 -0
  57. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_soft.h +9 -0
  58. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/implementations.h +41 -0
  59. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256.c +240 -0
  60. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_aesni.c +68 -0
  61. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_aesni.h +9 -0
  62. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_altivec.c +68 -0
  63. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_altivec.h +9 -0
  64. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_common.h +673 -0
  65. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_neon_aes.c +75 -0
  66. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_neon_aes.h +9 -0
  67. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_soft.c +58 -0
  68. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_soft.h +9 -0
  69. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/implementations.h +39 -0
  70. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2.c +247 -0
  71. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_aesni.c +103 -0
  72. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_aesni.h +9 -0
  73. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_altivec.c +101 -0
  74. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_altivec.h +9 -0
  75. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_avx2.c +74 -0
  76. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_avx2.h +11 -0
  77. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_common.h +790 -0
  78. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_neon_aes.c +109 -0
  79. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_neon_aes.h +9 -0
  80. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_soft.c +91 -0
  81. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_soft.h +9 -0
  82. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/implementations.h +41 -0
  83. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4.c +252 -0
  84. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_aesni.c +112 -0
  85. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_aesni.h +9 -0
  86. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_altivec.c +109 -0
  87. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_altivec.h +9 -0
  88. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_avx2.c +107 -0
  89. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_avx2.h +11 -0
  90. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_avx512.c +79 -0
  91. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_avx512.h +11 -0
  92. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_common.h +805 -0
  93. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_neon_aes.c +117 -0
  94. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_neon_aes.h +9 -0
  95. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_soft.c +99 -0
  96. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_soft.h +9 -0
  97. data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/implementations.h +42 -0
  98. data/ext/pq_crypto_seal/vendor/libaegis/src/common/common.c +81 -0
  99. data/ext/pq_crypto_seal/vendor/libaegis/src/common/common.h +144 -0
  100. data/ext/pq_crypto_seal/vendor/libaegis/src/common/cpu.c +378 -0
  101. data/ext/pq_crypto_seal/vendor/libaegis/src/common/cpu.h +34 -0
  102. data/ext/pq_crypto_seal/vendor/libaegis/src/common/keccak.c +187 -0
  103. data/ext/pq_crypto_seal/vendor/libaegis/src/common/keccak.h +13 -0
  104. data/ext/pq_crypto_seal/vendor/libaegis/src/common/softaes.c +338 -0
  105. data/ext/pq_crypto_seal/vendor/libaegis/src/common/softaes.h +69 -0
  106. data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis.h +77 -0
  107. data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis128l.h +311 -0
  108. data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis128x2.h +313 -0
  109. data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis128x4.h +313 -0
  110. data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis256.h +311 -0
  111. data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis256x2.h +313 -0
  112. data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis256x4.h +313 -0
  113. data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis_raf.h +580 -0
  114. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf.c +87 -0
  115. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis128l.c +20 -0
  116. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis128x2.c +20 -0
  117. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis128x4.c +20 -0
  118. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis256.c +20 -0
  119. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis256x2.c +20 -0
  120. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis256x4.c +20 -0
  121. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_internal.h +152 -0
  122. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_merkle.c +268 -0
  123. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_merkle.h +165 -0
  124. data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_variant.h +1119 -0
  125. data/fuzz/decrypt_fuzz.rb +119 -0
  126. data/lib/pq_crypto/seal/binary.rb +62 -0
  127. data/lib/pq_crypto/seal/core.rb +398 -0
  128. data/lib/pq_crypto/seal/errors.rb +15 -0
  129. data/lib/pq_crypto/seal/format.rb +275 -0
  130. data/lib/pq_crypto/seal/io.rb +336 -0
  131. data/lib/pq_crypto/seal/native.rb +13 -0
  132. data/lib/pq_crypto/seal/padding.rb +47 -0
  133. data/lib/pq_crypto/seal/version.rb +6 -0
  134. data/lib/pq_crypto/seal.rb +32 -0
  135. data/pq_crypto-seal.gemspec +37 -0
  136. data/script/vendor_libs.rb +79 -0
  137. data/test/aegis_vectors_test.rb +54 -0
  138. data/test/golden_vectors_test.rb +183 -0
  139. data/test/io_test.rb +125 -0
  140. data/test/native_test.rb +36 -0
  141. data/test/seal_test.rb +238 -0
  142. data/test/test_helper.rb +6 -0
  143. metadata +244 -0
@@ -0,0 +1,109 @@
1
+ #if defined(__ALTIVEC__) && defined(__CRYPTO__)
2
+
3
+ # include <stddef.h>
4
+ # include <stdint.h>
5
+
6
+ # include "../common/common.h"
7
+ # include "aegis256x4.h"
8
+ # include "aegis256x4_altivec.h"
9
+
10
+ # include <altivec.h>
11
+
12
+ # ifdef __clang__
13
+ # pragma clang attribute push(__attribute__((target("altivec,crypto"))), apply_to = function)
14
+ # elif defined(__GNUC__)
15
+ # pragma GCC target("altivec,crypto")
16
+ # endif
17
+
18
+ # define AES_BLOCK_LENGTH 64
19
+
20
+ typedef struct {
21
+ vector unsigned char b0;
22
+ vector unsigned char b1;
23
+ vector unsigned char b2;
24
+ vector unsigned char b3;
25
+ } aes_block_t;
26
+
27
+ static inline aes_block_t
28
+ AES_BLOCK_XOR(const aes_block_t a, const aes_block_t b)
29
+ {
30
+ return (aes_block_t) { vec_xor(a.b0, b.b0), vec_xor(a.b1, b.b1), vec_xor(a.b2, b.b2),
31
+ vec_xor(a.b3, b.b3) };
32
+ }
33
+
34
+ static inline aes_block_t
35
+ AES_BLOCK_AND(const aes_block_t a, const aes_block_t b)
36
+ {
37
+ return (aes_block_t) { vec_and(a.b0, b.b0), vec_and(a.b1, b.b1), vec_and(a.b2, b.b2),
38
+ vec_and(a.b3, b.b3) };
39
+ }
40
+
41
+ static inline aes_block_t
42
+ AES_BLOCK_LOAD(const uint8_t *a)
43
+ {
44
+ return (aes_block_t) { vec_xl_be(0, a), vec_xl_be(0, a + 16), vec_xl_be(0, a + 32),
45
+ vec_xl_be(0, a + 48) };
46
+ }
47
+
48
+ static inline aes_block_t
49
+ AES_BLOCK_LOAD_64x2(uint64_t a, uint64_t b)
50
+ {
51
+ const vector unsigned char t = ((vector unsigned char) vec_revb(
52
+ vec_insert(a, vec_promote((unsigned long long) (b), 1), 0)));
53
+ return (aes_block_t) { t, t, t, t };
54
+ }
55
+ static inline void
56
+ AES_BLOCK_STORE(uint8_t *a, const aes_block_t b)
57
+ {
58
+ vec_xst_be(b.b0, 0, a);
59
+ vec_xst_be(b.b1, 0, a + 16);
60
+ vec_xst_be(b.b2, 0, a + 32);
61
+ vec_xst_be(b.b3, 0, a + 48);
62
+ }
63
+
64
+ static inline aes_block_t
65
+ AES_ENC(const aes_block_t a, const aes_block_t b)
66
+ {
67
+ return (aes_block_t) { vec_cipher_be(a.b0, b.b0), vec_cipher_be(a.b1, b.b1),
68
+ vec_cipher_be(a.b2, b.b2), vec_cipher_be(a.b3, b.b3) };
69
+ }
70
+
71
+ static inline void
72
+ aegis256x4_update(aes_block_t *const state, const aes_block_t d)
73
+ {
74
+ aes_block_t tmp;
75
+
76
+ tmp = state[5];
77
+ state[5] = AES_ENC(state[4], state[5]);
78
+ state[4] = AES_ENC(state[3], state[4]);
79
+ state[3] = AES_ENC(state[2], state[3]);
80
+ state[2] = AES_ENC(state[1], state[2]);
81
+ state[1] = AES_ENC(state[0], state[1]);
82
+ state[0] = AES_BLOCK_XOR(AES_ENC(tmp, state[0]), d);
83
+ }
84
+
85
+ # include "aegis256x4_common.h"
86
+
87
+ struct aegis256x4_implementation aegis256x4_altivec_implementation = {
88
+ .encrypt_detached = encrypt_detached,
89
+ .decrypt_detached = decrypt_detached,
90
+ .encrypt_unauthenticated = encrypt_unauthenticated,
91
+ .decrypt_unauthenticated = decrypt_unauthenticated,
92
+ .stream = stream,
93
+ .state_init = state_init,
94
+ .state_encrypt_update = state_encrypt_update,
95
+ .state_encrypt_final = state_encrypt_final,
96
+ .state_decrypt_update = state_decrypt_update,
97
+ .state_decrypt_final = state_decrypt_final,
98
+ .state_mac_init = state_mac_init,
99
+ .state_mac_update = state_mac_update,
100
+ .state_mac_final = state_mac_final,
101
+ .state_mac_reset = state_mac_reset,
102
+ .state_mac_clone = state_mac_clone,
103
+ };
104
+
105
+ # ifdef __clang__
106
+ # pragma clang attribute pop
107
+ # endif
108
+
109
+ #endif
@@ -0,0 +1,9 @@
1
+ #ifndef aegis256x4_altivec_H
2
+ #define aegis256x4_altivec_H
3
+
4
+ #include "../common/common.h"
5
+ #include "implementations.h"
6
+
7
+ extern struct aegis256x4_implementation aegis256x4_altivec_implementation;
8
+
9
+ #endif
@@ -0,0 +1,107 @@
1
+ #if defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_AMD64)
2
+
3
+ # include <stddef.h>
4
+ # include <stdint.h>
5
+
6
+ # include "../common/common.h"
7
+ # include "aegis256x4.h"
8
+ # include "aegis256x4_avx2.h"
9
+
10
+ # ifdef HAVE_VAESINTRIN_H
11
+
12
+ # ifdef __clang__
13
+ # pragma clang attribute push(__attribute__((target("aes,vaes,avx2"))), \
14
+ apply_to = function)
15
+ # elif defined(__GNUC__)
16
+ # pragma GCC target("aes,vaes,avx2")
17
+ # endif
18
+
19
+ # include <immintrin.h>
20
+
21
+ # define AES_BLOCK_LENGTH 64
22
+
23
+ typedef struct {
24
+ __m256i b0;
25
+ __m256i b1;
26
+ } aes_block_t;
27
+
28
+ static inline aes_block_t
29
+ AES_BLOCK_XOR(const aes_block_t a, const aes_block_t b)
30
+ {
31
+ return (aes_block_t) { _mm256_xor_si256(a.b0, b.b0), _mm256_xor_si256(a.b1, b.b1) };
32
+ }
33
+
34
+ static inline aes_block_t
35
+ AES_BLOCK_AND(const aes_block_t a, const aes_block_t b)
36
+ {
37
+ return (aes_block_t) { _mm256_and_si256(a.b0, b.b0), _mm256_and_si256(a.b1, b.b1) };
38
+ }
39
+
40
+ static inline aes_block_t
41
+ AES_BLOCK_LOAD(const uint8_t *a)
42
+ {
43
+ return (aes_block_t) { _mm256_loadu_si256((const __m256i *) (const void *) a),
44
+ _mm256_loadu_si256((const __m256i *) (const void *) (a + 32)) };
45
+ }
46
+
47
+ static inline aes_block_t
48
+ AES_BLOCK_LOAD_64x2(uint64_t a, uint64_t b)
49
+ {
50
+ const __m256i t = _mm256_broadcastsi128_si256(_mm_set_epi64x((long long) a, (long long) b));
51
+ return (aes_block_t) { t, t };
52
+ }
53
+
54
+ static inline void
55
+ AES_BLOCK_STORE(uint8_t *a, const aes_block_t b)
56
+ {
57
+ _mm256_storeu_si256((__m256i *) (void *) a, b.b0);
58
+ _mm256_storeu_si256((__m256i *) (void *) (a + 32), b.b1);
59
+ }
60
+
61
+ static inline aes_block_t
62
+ AES_ENC(const aes_block_t a, const aes_block_t b)
63
+ {
64
+ return (aes_block_t) { _mm256_aesenc_epi128(a.b0, b.b0), _mm256_aesenc_epi128(a.b1, b.b1) };
65
+ }
66
+
67
+ static inline void
68
+ aegis256x4_update(aes_block_t *const state, const aes_block_t d)
69
+ {
70
+ aes_block_t tmp;
71
+
72
+ tmp = state[5];
73
+ state[5] = AES_ENC(state[4], state[5]);
74
+ state[4] = AES_ENC(state[3], state[4]);
75
+ state[3] = AES_ENC(state[2], state[3]);
76
+ state[2] = AES_ENC(state[1], state[2]);
77
+ state[1] = AES_ENC(state[0], state[1]);
78
+ state[0] = AES_BLOCK_XOR(AES_ENC(tmp, state[0]), d);
79
+ }
80
+
81
+ # include "aegis256x4_common.h"
82
+
83
+ struct aegis256x4_implementation aegis256x4_avx2_implementation = {
84
+ .encrypt_detached = encrypt_detached,
85
+ .decrypt_detached = decrypt_detached,
86
+ .encrypt_unauthenticated = encrypt_unauthenticated,
87
+ .decrypt_unauthenticated = decrypt_unauthenticated,
88
+ .stream = stream,
89
+ .state_init = state_init,
90
+ .state_encrypt_update = state_encrypt_update,
91
+ .state_encrypt_final = state_encrypt_final,
92
+ .state_decrypt_update = state_decrypt_update,
93
+ .state_decrypt_final = state_decrypt_final,
94
+ .state_mac_init = state_mac_init,
95
+ .state_mac_update = state_mac_update,
96
+ .state_mac_final = state_mac_final,
97
+ .state_mac_reset = state_mac_reset,
98
+ .state_mac_clone = state_mac_clone,
99
+ };
100
+
101
+ # ifdef __clang__
102
+ # pragma clang attribute pop
103
+ # endif
104
+
105
+ # endif
106
+
107
+ #endif
@@ -0,0 +1,11 @@
1
+ #ifndef aegis256x4_avx2_H
2
+ #define aegis256x4_avx2_H
3
+
4
+ #include "../common/common.h"
5
+ #include "implementations.h"
6
+
7
+ #ifdef HAVE_VAESINTRIN_H
8
+ extern struct aegis256x4_implementation aegis256x4_avx2_implementation;
9
+ #endif
10
+
11
+ #endif
@@ -0,0 +1,79 @@
1
+ #if defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_AMD64)
2
+
3
+ # include <stddef.h>
4
+ # include <stdint.h>
5
+
6
+ # include "../common/common.h"
7
+ # include "aegis256x4.h"
8
+ # include "aegis256x4_avx512.h"
9
+
10
+ # ifdef HAVE_VAESINTRIN_H
11
+
12
+ # ifdef __clang__
13
+ # if __clang_major__ >= 18 && __clang_major__ < 22
14
+ # pragma clang attribute push(__attribute__((target("aes,vaes,avx512f,evex512"))), \
15
+ apply_to = function)
16
+ # else
17
+ # pragma clang attribute push(__attribute__((target("aes,vaes,avx512f"))), \
18
+ apply_to = function)
19
+ # endif
20
+ # elif defined(__GNUC__)
21
+ # pragma GCC target("aes,vaes,avx512f")
22
+ # endif
23
+
24
+ # include <immintrin.h>
25
+
26
+ # define AES_BLOCK_LENGTH 64
27
+
28
+ typedef __m512i aes_block_t;
29
+
30
+ # define AES_BLOCK_XOR(A, B) _mm512_xor_si512((A), (B))
31
+ # define AES_BLOCK_AND(A, B) _mm512_and_si512((A), (B))
32
+ # define AES_BLOCK_LOAD128_BROADCAST(A) \
33
+ _mm512_broadcast_i32x4(_mm_loadu_si128((const void *) (A)))
34
+ # define AES_BLOCK_LOAD(A) _mm512_loadu_si512((const aes_block_t *) (const void *) (A))
35
+ # define AES_BLOCK_LOAD_64x2(A, B) _mm512_broadcast_i32x4(_mm_set_epi64x((A), (B)))
36
+ # define AES_BLOCK_STORE(A, B) _mm512_storeu_si512((aes_block_t *) (void *) (A), (B))
37
+ # define AES_ENC(A, B) _mm512_aesenc_epi128((A), (B))
38
+
39
+ static inline void
40
+ aegis256x4_update(aes_block_t *const state, const aes_block_t d)
41
+ {
42
+ aes_block_t tmp;
43
+
44
+ tmp = state[5];
45
+ state[5] = AES_ENC(state[4], state[5]);
46
+ state[4] = AES_ENC(state[3], state[4]);
47
+ state[3] = AES_ENC(state[2], state[3]);
48
+ state[2] = AES_ENC(state[1], state[2]);
49
+ state[1] = AES_ENC(state[0], state[1]);
50
+ state[0] = AES_BLOCK_XOR(AES_ENC(tmp, state[0]), d);
51
+ }
52
+
53
+ # include "aegis256x4_common.h"
54
+
55
+ struct aegis256x4_implementation aegis256x4_avx512_implementation = {
56
+ .encrypt_detached = encrypt_detached,
57
+ .decrypt_detached = decrypt_detached,
58
+ .encrypt_unauthenticated = encrypt_unauthenticated,
59
+ .decrypt_unauthenticated = decrypt_unauthenticated,
60
+ .stream = stream,
61
+ .state_init = state_init,
62
+ .state_encrypt_update = state_encrypt_update,
63
+ .state_encrypt_final = state_encrypt_final,
64
+ .state_decrypt_update = state_decrypt_update,
65
+ .state_decrypt_final = state_decrypt_final,
66
+ .state_mac_init = state_mac_init,
67
+ .state_mac_update = state_mac_update,
68
+ .state_mac_final = state_mac_final,
69
+ .state_mac_reset = state_mac_reset,
70
+ .state_mac_clone = state_mac_clone,
71
+ };
72
+
73
+ # ifdef __clang__
74
+ # pragma clang attribute pop
75
+ # endif
76
+
77
+ # endif
78
+
79
+ #endif
@@ -0,0 +1,11 @@
1
+ #ifndef aegis256x4_avx512_H
2
+ #define aegis256x4_avx512_H
3
+
4
+ #include "../common/common.h"
5
+ #include "implementations.h"
6
+
7
+ #ifdef HAVE_VAESINTRIN_H
8
+ extern struct aegis256x4_implementation aegis256x4_avx512_implementation;
9
+ #endif
10
+
11
+ #endif