Line data Source code
1 : #ifndef HEADER_fd_src_ballet_aes_fd_aes_h
2 : #define HEADER_fd_src_ballet_aes_fd_aes_h
3 :
4 : #include "../fd_ballet_base.h"
5 : #include "../../util/sanitize/fd_msan.h"
6 :
7 145872 : #define FD_AES_128_KEY_SZ (16UL)
8 :
9 : /* Reference backend internals ****************************************/
10 :
11 : struct fd_aes_key_ref {
12 : uint rd_key[ 60 ];
13 : int rounds;
14 : };
15 :
16 : typedef struct fd_aes_key_ref fd_aes_key_ref_t;
17 :
18 : FD_PROTOTYPES_BEGIN
19 :
20 : int
21 : fd_aes_ref_set_encrypt_key( uchar const * user_key,
22 : ulong bits,
23 : fd_aes_key_ref_t * key );
24 :
25 : int
26 : fd_aes_ref_set_decrypt_key( uchar const * user_key,
27 : ulong bits,
28 : fd_aes_key_ref_t * key );
29 :
30 : void
31 : fd_aes_ref_encrypt_core( uchar const * in,
32 : uchar * out,
33 : fd_aes_key_ref_t const * key );
34 :
35 : void
36 : fd_aes_ref_decrypt_core( uchar const * in,
37 : uchar * out,
38 : fd_aes_key_ref_t const * key );
39 :
40 : FD_PROTOTYPES_END
41 :
42 : /* AES-NI backend internals *******************************************/
43 :
44 : #if FD_HAS_AESNI
45 :
46 : FD_PROTOTYPES_BEGIN
47 :
48 : __attribute__((sysv_abi)) void
49 : fd_aesni_set_encrypt_key( uchar const * user_key,
50 : ulong bits,
51 : fd_aes_key_ref_t * key );
52 :
53 : __attribute__((sysv_abi)) void
54 : fd_aesni_set_decrypt_key( uchar const * user_key,
55 : ulong bits,
56 : fd_aes_key_ref_t * key );
57 :
58 : __attribute__((sysv_abi)) void
59 : fd_aesni_encrypt( uchar const * in,
60 : uchar * out,
61 : fd_aes_key_ref_t * key );
62 :
63 : __attribute__((sysv_abi)) void
64 : fd_aesni_decrypt( uchar const * in,
65 : uchar * out,
66 : fd_aes_key_ref_t * key );
67 :
68 : FD_PROTOTYPES_END
69 :
70 : #endif /* FD_HAS_AESNI */
71 :
72 : /* Backend selection **************************************************/
73 :
74 : #if FD_HAS_AESNI
75 : #define FD_AES_IMPL 1 /* AESNI */
76 : #else
77 : #define FD_AES_IMPL 0 /* Portable */
78 : #endif
79 :
80 : #if FD_AES_IMPL == 0
81 :
82 : typedef fd_aes_key_ref_t fd_aes_key_t;
83 218566385 : #define fd_aes_private_encrypt fd_aes_ref_encrypt_core
84 : #define fd_aes_private_decrypt fd_aes_ref_encrypt_core
85 13141053 : #define fd_aes_private_set_encrypt_key fd_aes_ref_set_encrypt_key
86 : #define fd_aes_private_set_decrypt_key fd_aes_ref_set_decrypt_key
87 :
88 : #elif FD_AES_IMPL == 1
89 :
90 : typedef fd_aes_key_ref_t fd_aes_key_t;
91 45044535 : #define fd_aes_private_encrypt fd_aesni_encrypt
92 : #define fd_aes_private_decrypt fd_aesni_decrypt
93 45044535 : #define fd_aes_private_set_encrypt_key fd_aesni_set_encrypt_key
94 : #define fd_aes_private_set_decrypt_key fd_aesni_set_decrypt_key
95 :
96 : #endif
97 :
98 : static inline void
99 : fd_aes_set_encrypt_key( uchar const * user_key,
100 : ulong bits,
101 58185588 : fd_aes_key_t * key ) {
102 58185588 : fd_msan_check ( user_key, bits/8 );
103 58185588 : fd_msan_unpoison( key, sizeof(fd_aes_key_t) );
104 58185588 : fd_aes_private_set_encrypt_key( user_key, bits, key );
105 58185588 : }
106 :
107 : static inline void
108 : fd_aes_set_decrypt_key( uchar const * user_key,
109 : ulong bits,
110 0 : fd_aes_key_t * key ) {
111 0 : fd_msan_check ( user_key, bits/8 );
112 0 : fd_msan_unpoison( key, sizeof(fd_aes_key_t) );
113 0 : fd_aes_private_set_decrypt_key( user_key, bits, key );
114 0 : }
115 :
116 : static inline void
117 : fd_aes_encrypt( uchar const * in,
118 : uchar * out,
119 263610920 : fd_aes_key_t * key ) {
120 263610920 : fd_msan_check ( key, sizeof(fd_aes_key_t) );
121 263610920 : fd_msan_check ( in, 16UL );
122 263610920 : fd_msan_unpoison( out, 16UL );
123 263610920 : fd_aes_private_encrypt( in, out, key );
124 263610920 : }
125 :
126 : static inline void
127 : fd_aes_decrypt( uchar const * in,
128 : uchar * out,
129 0 : fd_aes_key_t * key ) {
130 0 : fd_msan_check ( key, sizeof(fd_aes_key_t) );
131 0 : fd_msan_check ( in, 16UL );
132 0 : fd_msan_unpoison( out, 16UL );
133 0 : fd_aes_private_decrypt( in, out, key );
134 0 : }
135 :
136 : #endif /* HEADER_fd_src_ballet_aes_fd_aes_h */
|