@@ -36,6 +36,10 @@ static const EVP_CIPHER *cipher_cbc = NULL;
3636static const EVP_CIPHER * cipher_gcm = NULL ;
3737static const EVP_CIPHER * cipher_ctr_ecb = NULL ;
3838
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+
3943void
4044AesInit (void )
4145{
@@ -45,21 +49,26 @@ AesInit(void)
4549 cipher_cbc = EVP_aes_128_cbc ();
4650 cipher_gcm = EVP_aes_128_gcm ();
4751 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 ();
4856}
4957
5058static 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 )
5260{
5361 int out_len ;
62+ const EVP_CIPHER * cipher = key_len == 32 ? cipher_ctr_ecb_256 : cipher_ctr_ecb ;
5463
5564 if (* ctxPtr == NULL )
5665 {
57- Assert (cipher_ctr_ecb != NULL );
66+ Assert (cipher != NULL );
5867
5968 * ctxPtr = EVP_CIPHER_CTX_new ();
6069 EVP_CIPHER_CTX_init (* ctxPtr );
6170
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 )
6372 ereport (ERROR ,
6473 errmsg ("EVP_CipherInit_ex failed. OpenSSL error: %s" , ERR_error_string (ERR_get_error (), NULL )));
6574
@@ -74,19 +83,20 @@ AesEcbEncrypt(EVP_CIPHER_CTX **ctxPtr, const unsigned char *key, const unsigned
7483}
7584
7685static 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 )
7887{
7988 int out_len ;
8089 int out_len_final ;
8190 EVP_CIPHER_CTX * ctx = NULL ;
91+ const EVP_CIPHER * cipher = key_len == 32 ? cipher_cbc_256 : cipher_cbc ;
8292
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 );
8595
8696 ctx = EVP_CIPHER_CTX_new ();
8797 EVP_CIPHER_CTX_init (ctx );
8898
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 )
90100 ereport (ERROR ,
91101 errmsg ("EVP_CipherInit_ex failed. OpenSSL error: %s" , ERR_error_string (ERR_get_error (), NULL )));
92102
@@ -112,31 +122,32 @@ AesRunCbc(int enc, const unsigned char *key, const unsigned char *iv, const unsi
112122}
113123
114124void
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 )
116126{
117- AesRunCbc (1 , key , iv , in , in_len , out );
127+ AesRunCbc (1 , key , key_len , iv , in , in_len , out );
118128}
119129
120130void
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 )
122132{
123- AesRunCbc (0 , key , iv , in , in_len , out );
133+ AesRunCbc (0 , key , key_len , iv , in , in_len , out );
124134}
125135
126136void
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 )
128138{
129139 int out_len ;
130140 int out_len_final ;
131141 EVP_CIPHER_CTX * ctx ;
142+ const EVP_CIPHER * cipher = key_len == 32 ? cipher_gcm_256 : cipher_gcm ;
132143
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 );
135146
136147 ctx = EVP_CIPHER_CTX_new ();
137148 EVP_CIPHER_CTX_init (ctx );
138149
139- if (EVP_EncryptInit_ex (ctx , cipher_gcm , NULL , NULL , NULL ) == 0 )
150+ if (EVP_EncryptInit_ex (ctx , cipher , NULL , NULL , NULL ) == 0 )
140151 ereport (ERROR ,
141152 errmsg ("EVP_EncryptInit_ex failed. OpenSSL error: %s" , ERR_error_string (ERR_get_error (), NULL )));
142153
@@ -180,18 +191,19 @@ AesGcmEncrypt(const unsigned char *key, const unsigned char *iv, int iv_len, con
180191}
181192
182193bool
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 )
184195{
185196 int out_len ;
186197 int out_len_final ;
187198 EVP_CIPHER_CTX * ctx ;
199+ const EVP_CIPHER * cipher = key_len == 32 ? cipher_gcm_256 : cipher_gcm ;
188200
189- Assert (in_len % EVP_CIPHER_block_size (cipher_gcm ) == 0 );
201+ Assert (in_len % EVP_CIPHER_block_size (cipher ) == 0 );
190202
191203 ctx = EVP_CIPHER_CTX_new ();
192204 EVP_CIPHER_CTX_init (ctx );
193205
194- if (EVP_DecryptInit_ex (ctx , cipher_gcm , NULL , NULL , NULL ) == 0 )
206+ if (EVP_DecryptInit_ex (ctx , cipher , NULL , NULL , NULL ) == 0 )
195207 ereport (ERROR ,
196208 errmsg ("EVP_EncryptInit_ex failed. OpenSSL error: %s" , ERR_error_string (ERR_get_error (), NULL )));
197209
@@ -243,7 +255,7 @@ AesGcmDecrypt(const unsigned char *key, const unsigned char *iv, int iv_len, con
243255 * This function assumes that the out buffer is big enough: at least (blockNumber2 - blockNumber1) * 16 bytes
244256 */
245257void
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 )
247259{
248260 unsigned char * p ;
249261
@@ -265,5 +277,5 @@ AesCtrEncryptedZeroBlocks(void *ctxPtr, const unsigned char *key, const char *iv
265277 p += sizeof (j );
266278 }
267279
268- AesEcbEncrypt (ctxPtr , key , out , p - out , out );
280+ AesEcbEncrypt (ctxPtr , key , key_len , out , p - out , out );
269281}
0 commit comments