@@ -36,6 +36,10 @@ static const EVP_CIPHER *cipher_cbc = NULL;
36
36
static const EVP_CIPHER * cipher_gcm = NULL ;
37
37
static const EVP_CIPHER * cipher_ctr_ecb = NULL ;
38
38
39
+ static const EVP_CIPHER * cipher_cbc_256 = NULL ;
40
+ static const EVP_CIPHER * cipher_gcm_256 = NULL ;
41
+ static const EVP_CIPHER * cipher_ctr_ecb_256 = NULL ;
42
+
39
43
void
40
44
AesInit (void )
41
45
{
@@ -45,21 +49,26 @@ AesInit(void)
45
49
cipher_cbc = EVP_aes_128_cbc ();
46
50
cipher_gcm = EVP_aes_128_gcm ();
47
51
cipher_ctr_ecb = EVP_aes_128_ecb ();
52
+
53
+ cipher_cbc_256 = EVP_aes_256_cbc ();
54
+ cipher_gcm_256 = EVP_aes_256_gcm ();
55
+ cipher_ctr_ecb_256 = EVP_aes_256_ecb ();
48
56
}
49
57
50
58
static void
51
- AesEcbEncrypt (EVP_CIPHER_CTX * * ctxPtr , const unsigned char * key , const unsigned char * in , int in_len , unsigned char * out )
59
+ AesEcbEncrypt (EVP_CIPHER_CTX * * ctxPtr , const unsigned char * key , int key_len , const unsigned char * in , int in_len , unsigned char * out )
52
60
{
53
61
int out_len ;
62
+ const EVP_CIPHER * cipher = key_len == 32 ? cipher_ctr_ecb_256 : cipher_ctr_ecb ;
54
63
55
64
if (* ctxPtr == NULL )
56
65
{
57
- Assert (cipher_ctr_ecb != NULL );
66
+ Assert (cipher != NULL );
58
67
59
68
* ctxPtr = EVP_CIPHER_CTX_new ();
60
69
EVP_CIPHER_CTX_init (* ctxPtr );
61
70
62
- if (EVP_CipherInit_ex (* ctxPtr , cipher_ctr_ecb , NULL , key , NULL , 1 ) == 0 )
71
+ if (EVP_CipherInit_ex (* ctxPtr , cipher , NULL , key , NULL , 1 ) == 0 )
63
72
ereport (ERROR ,
64
73
errmsg ("EVP_CipherInit_ex failed. OpenSSL error: %s" , ERR_error_string (ERR_get_error (), NULL )));
65
74
@@ -74,19 +83,20 @@ AesEcbEncrypt(EVP_CIPHER_CTX **ctxPtr, const unsigned char *key, const unsigned
74
83
}
75
84
76
85
static void
77
- AesRunCbc (int enc , const unsigned char * key , const unsigned char * iv , const unsigned char * in , int in_len , unsigned char * out )
86
+ AesRunCbc (int enc , const unsigned char * key , int key_len , const unsigned char * iv , const unsigned char * in , int in_len , unsigned char * out )
78
87
{
79
88
int out_len ;
80
89
int out_len_final ;
81
90
EVP_CIPHER_CTX * ctx = NULL ;
91
+ const EVP_CIPHER * cipher = key_len == 32 ? cipher_cbc_256 : cipher_cbc ;
82
92
83
- Assert (cipher_cbc != NULL );
84
- Assert (in_len % EVP_CIPHER_block_size (cipher_cbc ) == 0 );
93
+ Assert (cipher != NULL );
94
+ Assert (in_len % EVP_CIPHER_block_size (cipher ) == 0 );
85
95
86
96
ctx = EVP_CIPHER_CTX_new ();
87
97
EVP_CIPHER_CTX_init (ctx );
88
98
89
- if (EVP_CipherInit_ex (ctx , cipher_cbc , NULL , key , iv , enc ) == 0 )
99
+ if (EVP_CipherInit_ex (ctx , cipher , NULL , key , iv , enc ) == 0 )
90
100
ereport (ERROR ,
91
101
errmsg ("EVP_CipherInit_ex failed. OpenSSL error: %s" , ERR_error_string (ERR_get_error (), NULL )));
92
102
@@ -112,31 +122,32 @@ AesRunCbc(int enc, const unsigned char *key, const unsigned char *iv, const unsi
112
122
}
113
123
114
124
void
115
- AesEncrypt (const unsigned char * key , const unsigned char * iv , const unsigned char * in , int in_len , unsigned char * out )
125
+ AesEncrypt (const unsigned char * key , int key_len , const unsigned char * iv , const unsigned char * in , int in_len , unsigned char * out )
116
126
{
117
- AesRunCbc (1 , key , iv , in , in_len , out );
127
+ AesRunCbc (1 , key , key_len , iv , in , in_len , out );
118
128
}
119
129
120
130
void
121
- AesDecrypt (const unsigned char * key , const unsigned char * iv , const unsigned char * in , int in_len , unsigned char * out )
131
+ AesDecrypt (const unsigned char * key , int key_len , const unsigned char * iv , const unsigned char * in , int in_len , unsigned char * out )
122
132
{
123
- AesRunCbc (0 , key , iv , in , in_len , out );
133
+ AesRunCbc (0 , key , key_len , iv , in , in_len , out );
124
134
}
125
135
126
136
void
127
- AesGcmEncrypt (const unsigned char * key , const unsigned char * iv , int iv_len , const unsigned char * aad , int aad_len , const unsigned char * in , int in_len , unsigned char * out , unsigned char * tag , int tag_len )
137
+ AesGcmEncrypt (const unsigned char * key , int key_len , const unsigned char * iv , int iv_len , const unsigned char * aad , int aad_len , const unsigned char * in , int in_len , unsigned char * out , unsigned char * tag , int tag_len )
128
138
{
129
139
int out_len ;
130
140
int out_len_final ;
131
141
EVP_CIPHER_CTX * ctx ;
142
+ const EVP_CIPHER * cipher = key_len == 32 ? cipher_gcm_256 : cipher_gcm ;
132
143
133
- Assert (cipher_gcm != NULL );
134
- Assert (in_len % EVP_CIPHER_block_size (cipher_gcm ) == 0 );
144
+ Assert (cipher != NULL );
145
+ Assert (in_len % EVP_CIPHER_block_size (cipher ) == 0 );
135
146
136
147
ctx = EVP_CIPHER_CTX_new ();
137
148
EVP_CIPHER_CTX_init (ctx );
138
149
139
- if (EVP_EncryptInit_ex (ctx , cipher_gcm , NULL , NULL , NULL ) == 0 )
150
+ if (EVP_EncryptInit_ex (ctx , cipher , NULL , NULL , NULL ) == 0 )
140
151
ereport (ERROR ,
141
152
errmsg ("EVP_EncryptInit_ex failed. OpenSSL error: %s" , ERR_error_string (ERR_get_error (), NULL )));
142
153
@@ -180,18 +191,19 @@ AesGcmEncrypt(const unsigned char *key, const unsigned char *iv, int iv_len, con
180
191
}
181
192
182
193
bool
183
- AesGcmDecrypt (const unsigned char * key , const unsigned char * iv , int iv_len , const unsigned char * aad , int aad_len , const unsigned char * in , int in_len , unsigned char * out , unsigned char * tag , int tag_len )
194
+ AesGcmDecrypt (const unsigned char * key , int key_len , const unsigned char * iv , int iv_len , const unsigned char * aad , int aad_len , const unsigned char * in , int in_len , unsigned char * out , unsigned char * tag , int tag_len )
184
195
{
185
196
int out_len ;
186
197
int out_len_final ;
187
198
EVP_CIPHER_CTX * ctx ;
199
+ const EVP_CIPHER * cipher = key_len == 32 ? cipher_gcm_256 : cipher_gcm ;
188
200
189
- Assert (in_len % EVP_CIPHER_block_size (cipher_gcm ) == 0 );
201
+ Assert (in_len % EVP_CIPHER_block_size (cipher ) == 0 );
190
202
191
203
ctx = EVP_CIPHER_CTX_new ();
192
204
EVP_CIPHER_CTX_init (ctx );
193
205
194
- if (EVP_DecryptInit_ex (ctx , cipher_gcm , NULL , NULL , NULL ) == 0 )
206
+ if (EVP_DecryptInit_ex (ctx , cipher , NULL , NULL , NULL ) == 0 )
195
207
ereport (ERROR ,
196
208
errmsg ("EVP_EncryptInit_ex failed. OpenSSL error: %s" , ERR_error_string (ERR_get_error (), NULL )));
197
209
@@ -243,7 +255,7 @@ AesGcmDecrypt(const unsigned char *key, const unsigned char *iv, int iv_len, con
243
255
* This function assumes that the out buffer is big enough: at least (blockNumber2 - blockNumber1) * 16 bytes
244
256
*/
245
257
void
246
- AesCtrEncryptedZeroBlocks (void * ctxPtr , const unsigned char * key , const char * iv_prefix , uint64_t blockNumber1 , uint64_t blockNumber2 , unsigned char * out )
258
+ AesCtrEncryptedZeroBlocks (void * ctxPtr , const unsigned char * key , int key_len , const char * iv_prefix , uint64_t blockNumber1 , uint64_t blockNumber2 , unsigned char * out )
247
259
{
248
260
unsigned char * p ;
249
261
@@ -265,5 +277,5 @@ AesCtrEncryptedZeroBlocks(void *ctxPtr, const unsigned char *key, const char *iv
265
277
p += sizeof (j );
266
278
}
267
279
268
- AesEcbEncrypt (ctxPtr , key , out , p - out , out );
280
+ AesEcbEncrypt (ctxPtr , key , key_len , out , p - out , out );
269
281
}
0 commit comments