libidav/crypto.c

changeset 459
2c112cbaa08e
parent 404
5c08b8e14df8
child 462
efda9aa1bbad
equal deleted inserted replaced
458:295eaa04fc41 459:2c112cbaa08e
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) {

mercurial