195 |
195 |
196 unsigned char *out = NULL; |
196 unsigned char *out = NULL; |
197 int outlen = 0; |
197 int outlen = 0; |
198 size_t ivl = enc->ivlen; |
198 size_t ivl = enc->ivlen; |
199 if(in_len != 0) { |
199 if(in_len != 0) { |
200 outlen = len + 16; |
200 outlen = len + 32; |
201 out = malloc(outlen + ivl); |
201 out = malloc(outlen + ivl); |
202 if(enc->iv) { |
202 if(enc->iv) { |
203 memcpy(out, enc->iv, ivl); |
203 memcpy(out, enc->iv, ivl); |
204 } |
204 } |
205 EVP_EncryptUpdate(enc->ctx, out + ivl, &outlen, in, in_len); |
205 EVP_EncryptUpdate(enc->ctx, out + ivl, &outlen, in, in_len); |
206 free(in); |
206 if(in_len != len) { |
|
207 int newoutlen = 16; |
|
208 EVP_EncryptFinal_ex(enc->ctx, out + ivl + outlen, &newoutlen); |
|
209 outlen += newoutlen; |
|
210 enc->end = 1; |
|
211 } |
207 } else { |
212 } else { |
208 out = malloc(16); |
213 out = malloc(16); |
209 EVP_EncryptFinal_ex(enc->ctx, out, &outlen); |
214 EVP_EncryptFinal_ex(enc->ctx, out, &outlen); |
210 enc->end = 1; |
215 enc->end = 1; |
211 free(in); |
|
212 } |
216 } |
213 enc->tmp = (char*)out; |
217 enc->tmp = (char*)out; |
214 enc->tmplen = outlen + ivl; |
218 enc->tmplen = outlen + ivl; |
215 enc->tmpoff = 0; |
219 enc->tmpoff = 0; |
216 |
220 |
217 if(enc->iv) { |
221 if(enc->iv) { |
218 free(enc->iv); |
222 free(enc->iv); |
219 enc->iv = NULL; |
223 enc->iv = NULL; |
220 enc->ivlen = 0; |
224 enc->ivlen = 0; |
221 } |
225 } |
|
226 |
|
227 free(in); |
222 |
228 |
223 return aes_read(buf, s, n, enc); |
229 return aes_read(buf, s, n, enc); |
224 } |
230 } |
225 |
231 |
226 void aes_encrypter_close(AESEncrypter *enc) { |
232 void aes_encrypter_close(AESEncrypter *enc) { |