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,103 @@
1
+ #if defined(__ALTIVEC__) && defined(__CRYPTO__)
2
+
3
+ # include <stddef.h>
4
+ # include <stdint.h>
5
+
6
+ # include "../common/common.h"
7
+ # include "aegis128x2.h"
8
+ # include "aegis128x2_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 32
19
+
20
+ typedef struct {
21
+ vector unsigned char b0;
22
+ vector unsigned char b1;
23
+ } aes_block_t;
24
+
25
+ static inline aes_block_t
26
+ AES_BLOCK_XOR(const aes_block_t a, const aes_block_t b)
27
+ {
28
+ return (aes_block_t) { vec_xor(a.b0, b.b0), vec_xor(a.b1, b.b1) };
29
+ }
30
+
31
+ static inline aes_block_t
32
+ AES_BLOCK_AND(const aes_block_t a, const aes_block_t b)
33
+ {
34
+ return (aes_block_t) { vec_and(a.b0, b.b0), vec_and(a.b1, b.b1) };
35
+ }
36
+
37
+ static inline aes_block_t
38
+ AES_BLOCK_LOAD(const uint8_t *a)
39
+ {
40
+ return (aes_block_t) { vec_xl_be(0, a), vec_xl_be(0, a + 16) };
41
+ }
42
+
43
+ static inline aes_block_t
44
+ AES_BLOCK_LOAD_64x2(uint64_t a, uint64_t b)
45
+ {
46
+ const vector unsigned char t = ((vector unsigned char) vec_revb(
47
+ vec_insert(a, vec_promote((unsigned long long) (b), 1), 0)));
48
+ return (aes_block_t) { t, t };
49
+ }
50
+ static inline void
51
+ AES_BLOCK_STORE(uint8_t *a, const aes_block_t b)
52
+ {
53
+ vec_xst_be(b.b0, 0, a);
54
+ vec_xst_be(b.b1, 0, a + 16);
55
+ }
56
+
57
+ static inline aes_block_t
58
+ AES_ENC(const aes_block_t a, const aes_block_t b)
59
+ {
60
+ return (aes_block_t) { vec_cipher_be(a.b0, b.b0), vec_cipher_be(a.b1, b.b1) };
61
+ }
62
+
63
+ static inline void
64
+ aegis128x2_update(aes_block_t *const state, const aes_block_t d1, const aes_block_t d2)
65
+ {
66
+ aes_block_t tmp;
67
+
68
+ tmp = state[7];
69
+ state[7] = AES_ENC(state[6], state[7]);
70
+ state[6] = AES_ENC(state[5], state[6]);
71
+ state[5] = AES_ENC(state[4], state[5]);
72
+ state[4] = AES_BLOCK_XOR(AES_ENC(state[3], state[4]), d2);
73
+ state[3] = AES_ENC(state[2], state[3]);
74
+ state[2] = AES_ENC(state[1], state[2]);
75
+ state[1] = AES_ENC(state[0], state[1]);
76
+ state[0] = AES_BLOCK_XOR(AES_ENC(tmp, state[0]), d1);
77
+ }
78
+
79
+ # include "aegis128x2_common.h"
80
+
81
+ struct aegis128x2_implementation aegis128x2_altivec_implementation = {
82
+ .encrypt_detached = encrypt_detached,
83
+ .decrypt_detached = decrypt_detached,
84
+ .encrypt_unauthenticated = encrypt_unauthenticated,
85
+ .decrypt_unauthenticated = decrypt_unauthenticated,
86
+ .stream = stream,
87
+ .state_init = state_init,
88
+ .state_encrypt_update = state_encrypt_update,
89
+ .state_encrypt_final = state_encrypt_final,
90
+ .state_decrypt_update = state_decrypt_update,
91
+ .state_decrypt_final = state_decrypt_final,
92
+ .state_mac_init = state_mac_init,
93
+ .state_mac_update = state_mac_update,
94
+ .state_mac_final = state_mac_final,
95
+ .state_mac_reset = state_mac_reset,
96
+ .state_mac_clone = state_mac_clone,
97
+ };
98
+
99
+ # ifdef __clang__
100
+ # pragma clang attribute pop
101
+ # endif
102
+
103
+ #endif
@@ -0,0 +1,9 @@
1
+ #ifndef aegis128x2_altivec_H
2
+ #define aegis128x2_altivec_H
3
+
4
+ #include "../common/common.h"
5
+ #include "implementations.h"
6
+
7
+ extern struct aegis128x2_implementation aegis128x2_altivec_implementation;
8
+
9
+ #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 "aegis128x2.h"
8
+ # include "aegis128x2_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 32
22
+
23
+ typedef __m256i aes_block_t;
24
+
25
+ # define AES_BLOCK_XOR(A, B) _mm256_xor_si256((A), (B))
26
+ # define AES_BLOCK_AND(A, B) _mm256_and_si256((A), (B))
27
+ # define AES_BLOCK_LOAD128_BROADCAST(A) \
28
+ _mm256_broadcastsi128_si256(_mm_loadu_si128((const void *) (A)))
29
+ # define AES_BLOCK_LOAD(A) _mm256_loadu_si256((const aes_block_t *) (const void *) (A))
30
+ # define AES_BLOCK_LOAD_64x2(A, B) _mm256_broadcastsi128_si256(_mm_set_epi64x((A), (B)))
31
+ # define AES_BLOCK_STORE(A, B) _mm256_storeu_si256((aes_block_t *) (void *) (A), (B))
32
+ # define AES_ENC(A, B) _mm256_aesenc_epi128((A), (B))
33
+
34
+ static inline void
35
+ aegis128x2_update(aes_block_t *const state, const aes_block_t d1, const aes_block_t d2)
36
+ {
37
+ aes_block_t tmp;
38
+
39
+ tmp = state[7];
40
+ state[7] = AES_ENC(state[6], state[7]);
41
+ state[6] = AES_ENC(state[5], state[6]);
42
+ state[5] = AES_ENC(state[4], state[5]);
43
+ state[4] = AES_ENC(state[3], state[4]);
44
+ state[3] = AES_ENC(state[2], state[3]);
45
+ state[2] = AES_ENC(state[1], state[2]);
46
+ state[1] = AES_ENC(state[0], state[1]);
47
+ state[0] = AES_ENC(tmp, state[0]);
48
+
49
+ state[0] = AES_BLOCK_XOR(state[0], d1);
50
+ state[4] = AES_BLOCK_XOR(state[4], d2);
51
+ }
52
+
53
+ # include "aegis128x2_common.h"
54
+
55
+ struct aegis128x2_implementation aegis128x2_avx2_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 aegis128x2_avx2_H
2
+ #define aegis128x2_avx2_H
3
+
4
+ #include "../common/common.h"
5
+ #include "implementations.h"
6
+
7
+ #ifdef HAVE_VAESINTRIN_H
8
+ extern struct aegis128x2_implementation aegis128x2_avx2_implementation;
9
+ #endif
10
+
11
+ #endif